package Ġcom . j ode v app . ank o . re cy ler view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Port er D uff Ċ import Ġandroid . os . Parcel Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Manager Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . annotation . Nullable Ċ import Ġandroidx . appcompat . widget . AppCompat CheckBox Ċ import Ġorg . jetbrains . ank o . An ko View Dsl Marker Ċ import Ġorg . jetbrains . ank o . custom . ank o View Ċ Ċ // ĠCopyright ĠÂ© Ġ 2 0 2 0 ĠComp ass . ĠAll Ġrights Ġreserved . ĊĊ Ċ /** Ċ Ġ* ĠFrom Ġhere ... Ċ Ġ* Ġhttps :// gist . github . com / ke vin - bar rient os / d 7 5 a 5 baa 1 3 a 6 8 6 3 6 7 d 4 5 d 1 7 aa ec 7 f 0 3 0 Ċ Ġ* Ċ Ġ* ĠBase Ġon Ġhttps :// stackoverflow . com / a / 4 0 9 3 9 3 6 7 / 3 9 5 0 4 9 7 Ġanswer . Ċ Ġ*/ Ċ class ĠCheckBox Tri States Ġ: ĠAppCompat CheckBox Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġstate Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġauto 3 State Ġ Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġlistener Ġset Ġto Ġthe Ġsuper Ġclass Ġwhich Ġis Ġgoing Ġto Ġbe Ġe voke Ġeach ĊĠĠĠĠ Ġ* Ġtime Ġthe Ġcheck Ġstate Ġhas Ġchanged . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġprivate Listener : ĠOn Checked ChangeListener Ġ= ĠOn Checked ChangeListener Ġ{ Ġbutton View , Ġis Checked Ġ-> ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auto 3 State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheckbox Ġstatus Ġis Ġchanged Ġfrom Ġun check Ġto Ġchecked . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUNKNOWN Ġ-> ĠsetState ( UN CHECK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN CHECK ED Ġ-> ĠsetState ( CHECK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHECK ED Ġ-> ĠsetState ( UN CHECK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN CHECK ED Ġ-> ĠsetState ( CHECK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHECK ED Ġ-> ĠsetState ( UN CHECK ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHold s Ġa Ġreference Ġto Ġthe Ġlistener Ġset Ġby Ġa Ġclient , Ġif Ġany . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġclient Listener : ĠOn Checked ChangeListener ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġflag Ġis Ġneeded Ġto Ġavoid Ġaccidentally Ġchanging Ġthe Ġcurrent Ġ[. state ] Ġwhen ĊĠĠĠĠ Ġ* Ġ[. on Restore InstanceState ] Ġcalls Ġ[. setChecked ] ĊĠĠĠĠ Ġ* Ġev oking Ġour Ġ[. private Listener ] Ġand Ġtherefore Ġchanging Ġthe Ġreal Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġrest oring Ġ= Ġfalse ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlayout Params Ġ: ĠLinearLayout . LayoutParams ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( this . get LayoutParams () Ġas ĠLinearLayout . LayoutParams ) ĊĊĠĠĠ Ġfun ĠgetState (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġselection State Ġ: ĠSelection State ĊĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN CHECK ED Ġ-> ĠSelection State . Un Checked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCHECK ED Ġ-> ĠSelection State . Checked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSelection State . In determinate ĊĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠ Ġupdate Btn () ĊĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetState ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! rest oring Ġ&& Ġthis . state Ġ!= Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Listener ?. on CheckedChanged ( this , Ġthis . isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Btn () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġlistener (@ Nullable Ġlistener : ĠOn Checked ChangeListener ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġnever Ġtruly Ġset Ġthe Ġlistener Ġto Ġthe Ġclient Ġimplementation , Ġinstead Ġwe Ġonly Ġhold ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġreference Ġto Ġit Ġand Ġe voke Ġit Ġwhen Ġneeded . ĊĠĠĠĠĠĠĠ Ġif Ġ( private Listener Ġ!== Ġlistener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġalways Ġuse Ġour Ġimplementation ĊĠĠĠĠĠĠĠ Ġsuper . setOn Checked ChangeListener ( private Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuper State : ĠParcel able ? Ġ= Ġsuper . on Save InstanceState () ĊĠĠĠĠĠĠĠ Ġval Ġss Ġ= ĠSaved State ( super State ) ĊĠĠĠĠĠĠĠ Ġss . state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġreturn Ġss ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrest oring Ġ= Ġtrue Ġ// Ġindicates Ġthat Ġthe Ġui Ġis Ġrest oring Ġits Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġss Ġ= Ġstate Ġas ĠSaved State ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( ss . get Super State ()) ĊĠĠĠĠĠĠĠ ĠsetState ( ss . state ) ĊĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠ Ġrest oring Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠUNKNOWN ĊĠĠĠĠĠĠĠ Ġupdate Btn () ĊĠĠĠĠĠĠĠ Ġset On Checked ChangeListener ( private Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Btn () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbtn Drawable : ĠInt Ġ= ĠR . drawable . ic _ in determinate _ check _ box _ 2 4 px ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUNKNOWN Ġ-> Ġbtn Drawable Ġ= ĠR . drawable . ic _ in determinate _ check _ box _ 2 4 px ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUN CHECK ED Ġ-> Ġbtn Drawable Ġ= ĠR . drawable . ic _ check _ box _ outline _ blank _ 2 4 px ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCHECK ED Ġ-> Ġbtn Drawable Ġ= ĠR . drawable . ic _ check _ box _ 2 4 px ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Button Drawable ( btn Drawable ) ĊĠĠĠĠĠĠĠ Ġbutton Tint Mode Ġ= ĠPort er D uff . Mode . DST ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠSaved State Ġ: ĠBase Saved State Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstate Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġconstructor ( super State : ĠParcel able ?) Ġ: Ġsuper ( super State ) Ġ{} ĊĠĠĠĠĠĠĠ Ġprivate Ġconstructor (` in `: ĠParcel ) Ġ: Ġsuper (` in `) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġ` in `. readInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠwriteTo Parcel ( out : ĠParcel , Ġflags : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . writeTo Parcel ( out , Ġflags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . writeValue ( state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ(" Checkbox Tri State . Saved State {" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠInteger . to HexString ( System . identity HashCode ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġstate =" Ġ+ Ġstate Ġ+ Ġ" }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠCRE ATOR : ĠParcel able . Creator < Saved State ?> Ġ= Ġobject Ġ: ĠParcel able . Creator < Saved State ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate From Parcel (` in `: ĠParcel ): ĠSaved State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSaved State (` in `) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Array ( size : ĠInt ): ĠArray < Saved State ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf Null s ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUNKNOWN Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUN CHECK ED Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHECK ED Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠSelection State ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUn Checked ( UN CHECK ED ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn determinate ( UNKNOWN ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChecked ( CHECK ED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun ĠView Manager . checkBox 3 ( init : Ġ(@ An ko View Dsl Marker ĠCheckBox Tri States ). () Ġ-> ĠUnit ): ĠCheckBox Tri States Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġan ko View ({ ĠCheckBox Tri States ( it ) Ġ}, Ġ 0 , Ġinit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }