package Ġcom . thought bot . expand abler ec y cl er view . sample . mult it ype and check Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . thought bot . expand able check recyclerview . Child Check Controller Ċ import Ġcom . thought bot . expand able check recyclerview . listeners . On Check Child ClickListener Ċ import Ġcom . thought bot . expand able check recyclerview . listeners . On Child Check Changed Listener Ċ import Ġcom . thought bot . expand able check recyclerview . listeners . On Children Check StateChanged Listener Ċ import Ġcom . thought bot . expand able check recyclerview . models . Checked Expand able Group Ċ import Ġcom . thought bot . expand abler ec y cl er view . Multi Type Expand able RecyclerView Adapter Ċ import Ġcom . thought bot . expand abler ec y cl er view . models . Expand able Group Ċ import Ġcom . thought bot . expand abler ec y cl er view . sample . Artist Ċ import Ġcom . thought bot . expand abler ec y cl er view . sample . R Ċ import Ġcom . thought bot . expand abler ec y cl er view . sample . expand . Artist ViewHolder Ċ import Ġcom . thought bot . expand abler ec y cl er view . sample . expand . Genre ViewHolder Ċ import Ġcom . thought bot . expand abler ec y cl er view . sample . single check . Single Check Artist ViewHolder Ċ import Ġcom . thought bot . expand abler ec y cl er view . view holders . Child ViewHolder Ċ import Ġjava . util .* Ċ Ċ class ĠMulti Type Check Genre Adapter ( groups : ĠList < Expand able Group < *> ?> ?) Ġ: ĠMulti Type Expand able RecyclerView Adapter < Genre ViewHolder , ĠChild ViewHolder >( groups ), ĠOn Child Check Changed Listener , ĠOn Children Check StateChanged Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġchild Check Controller : ĠChild Check Controller ĊĠĠĠ Ġprivate Ġval Ġchild ClickListener : ĠOn Check Child ClickListener ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun ĠonCreate Group ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠGen re ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . list _ item _ genre , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠGen re ViewHolder ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Child ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠChild ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAR TI ST _ VIEW _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . list _ item _ artist , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArtist ViewHolder ( artist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF AV OR ITE _ VIEW _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . list _ item _ single check _ ar ist , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Ġ= ĠSingle Check Artist ViewHolder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . setOn Child Checked Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ("$ view Type Ġis Ġan ĠInvalid Ġview Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Child ViewHolder ( holder : ĠChild ViewHolder , Ġflat Position : ĠInt , Ġgroup : ĠExpand able Group <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Type Ġ= ĠgetItem ViewType ( flat Position ) ĊĠĠĠĠĠĠĠ Ġval Ġartist Ġ= Ġgroup . items [ child Index ] Ġas ĠArtist ĊĠĠĠĠĠĠĠ Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAR TI ST _ VIEW _ TYPE Ġ-> Ġ( holder Ġas ĠArtist ViewHolder ). set Artist Name ( artist . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF AV OR ITE _ VIEW _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Position Ġ= Ġexpand able List . getUn flatten ed Position ( flat Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder Ġas ĠSingle Check Artist ViewHolder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Bind ViewHolder ( flat Position , Ġchild Check Controller . is Child Checked ( list Position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . set Artist Name ( artist . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind Group ViewHolder ( holder : ĠGen re ViewHolder , Ġflat Position : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup : ĠExpand able Group <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . set Genre Title ( group ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Child Check Changed ( view : ĠView , Ġchecked : ĠBoolean , Ġflat Pos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Pos Ġ= Ġexpand able List . getUn flatten ed Position ( flat Pos ) ĊĠĠĠĠĠĠĠ Ġchild Check Controller . on Child Check Changed ( checked , Ġlist Pos ) ĊĠĠĠĠĠĠĠ Ġchild ClickListener ?. on Check Child CL ick ( view , Ġchecked , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand able List . get Expand able Group ( list Pos ) Ġas ĠChecked Expand able Group , Ġlist Pos . child Pos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Children Check State ( firstChild Flatten ed Index : ĠInt , Ġnum Children : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Item Range Changed ( firstChild Flatten ed Index , Ġnum Children ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// out State . put Parcelable ArrayList ( CHECK ED _ STATE _ MAP , ĠArrayList < Any ? >( expand able List . groups )) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( savedInstanceState : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull Ġ|| Ġ! savedInstanceState . containsKey ( CHECK ED _ STATE _ MAP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpand able List . groups Ġ= ĠsavedInstanceState . get Parcelable ArrayList ( CHECK ED _ STATE _ MAP ) ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( savedInstanceState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Choices () Ġ{ ĊĠĠĠĠĠĠĠ Ġchild Check Controller . clear Check States () ĊĊĠĠĠĠĠĠĠ Ġ// only Ġupdate Ġthe Ġchild Ġviews Ġthat Ġare Ġvisible Ġ( i . e . Ġtheir Ġgroup Ġis Ġexpanded ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġgroups . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġgroups [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Group Expanded ( group )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Range Changed ( expand able List . get Flatten ed First Child Index ( i ), Ġgroup . item Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Child ( view Type : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġview Type Ġ== ĠF AV OR ITE _ VIEW _ TYPE Ġ|| Ġview Type Ġ== ĠAR TI ST _ VIEW _ TYPE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Child ViewType ( position : ĠInt , Ġgroup : ĠExpand able Group <* >, Ġchild Index : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(( group . items [ child Index ] Ġas ĠArtist ). is Favorite ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF AV OR ITE _ VIEW _ TYPE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAR TI ST _ VIEW _ TYPE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCHECK ED _ STATE _ MAP Ġ= Ġ" child _ check _ controller _ checked _ state _ map " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠF AV OR ITE _ VIEW _ TYPE Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAR TI ST _ VIEW _ TYPE Ġ= Ġ 4 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġchild Check Controller Ġ= ĠChild Check Controller ( expand able List , Ġthis ) ĊĠĠĠ Ġ} Ċ }