package Ġcom . cam er ash . filter drawer Ċ Ċ import Ġandroid . support . annotation . Color Res Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 7 . widget . Divider Item Decoration Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . LinearLayout Ċ import Ġnet . c ach apa . expand able layout . Expand able Layout Ċ Ċ /** Ċ Ġ* ĠAbstract Ġclass Ġfor Ġbase Ġimplementation Ġof ĠParent Item Ġused Ġin ĠFilter Drawer Ċ Ġ* Ċ Ġ* Ġ@ author ĠC amer ash Ċ Ġ* Ġ@ see ĠFilter Drawer Ċ Ġ*/ Ċ abstract Ġclass ĠParent Item Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġdrawable Ġicon Ġresource Ġfor Ġthe ĠParent Item ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġicon Ġdrawable Ġresource ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun ĠgetParent Icon (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġtitle Ġfor Ġthe ĠParent Item ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTitle Ġof ĠChild Item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun ĠgetParent Title (): ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġlayout Ġresource Ġfor Ġthe Ġcustomization Ġof ĠParent Item ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġlayout Ġresource Ġused Ġby ĠParent Item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Layout Res (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġroot Ġlinear Ġlayout Ġid Ġfor Ġthe Ġcustomization Ġof ĠParent Item ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠId Ġof Ġroot Ġlinear Ġlayout ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Root LinearLayout Id (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġview Ġid Ġwho Ġis Ġresponsible Ġfor Ġreceiving ĊĠĠĠĠ Ġ* Ġthe ĠonClick Ġevent Ġfor Ġto g gling Ġexpansion Ġof ĠParent Item . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsed Ġfor Ġthe Ġcustomization Ġof ĠParent Item ĊĠĠĠĠ Ġ* Ġ@ return ĠId Ġof Ġthe Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Toggle Expand OnClick View Id (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġlist Ġof ĠChild Item Ġunder Ġthis ĠParent Item ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof ĠCh ile Item Ġunder Ġthis ĠParent Item ĊĠĠĠĠ Ġ* Ġ@ see ĠChild Item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Child Collection (): ĠList < Child Item > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe ĠViewHolder Ġused Ġby Ġthe ĠParent Item ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġview Ġholder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget ViewHolder ( v : ĠView ): ĠViewHolder ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġcolor Ġresource Ġused Ġin Ġtitle Ġtext ĊĠĠĠĠ Ġ* Ġwhen Ġnone Ġof Ġthe ĠChild Items Ġunder Ġthis ĠParent Item Ġare Ġselected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcolor Ġresource ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun ĠgetDefault TextColor Res (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġcolor Ġresource Ġused Ġin Ġtitle Ġtext ĊĠĠĠĠ Ġ* Ġwhen Ġone Ġor Ġmore ĠChild Items Ġunder Ġthis ĠParent Item Ġare Ġselected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcolor Ġresource ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Selected TextColor Res (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġcolor Ġresource Ġof Ġicon Ġused ĊĠĠĠĠ Ġ* Ġwhen Ġnone Ġof Ġthe ĠChild Items Ġunder Ġthis ĠParent Item Ġare Ġselected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcolor Ġresource ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun ĠgetDefault Icon Color Res (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġcolor Ġresource Ġof Ġicon Ġused ĊĠĠĠĠ Ġ* Ġwhen Ġone Ġor Ġmore ĠChild Items Ġunder Ġthis ĠParent Item Ġare Ġselected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcolor Ġresource ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Selected Icon Color Res (): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSup ply Ġthe Ġoption Ġof Ġwhether Ġthe ĠChild Items Ġof Ġthis ĠParent Item ĊĠĠĠĠ Ġ* Ġcan Ġbe Ġmulti - selected ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġmulti - selected ĠChild Items Ġare Ġallowed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġallow Select Multiple (): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBase Ġimplementation Ġof Ġthe ĠViewHolder Ġof ĠParent Item Ġused Ġin Ġthe ĠFilter Drawer 's ĠRecyclerView ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġv ĠView Ġused Ġin Ġconstructing ĠViewHolder ĊĠĠĠĠ Ġ* Ġ@ see ĠParent Adapter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġinner Ġclass ĠViewHolder ( v : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( v ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġroot ĠLinearLayout Ġto Ġadd Ġour ĠExpand able Layout Ġinto ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġroot : ĠLinearLayout ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġview Ġresponsible Ġfor Ġreceiving ĠonClick Ġevent Ġto Ġtoggle Ġexpansion Ġof Ġthe ĠParent Item ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġheader View : ĠView Ġ= ĠitemView . findViewById ( get Toggle Expand OnClick View Id ()) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠExpand able Layout Ġwhich Ġhost Ġthe Ġchild ĠRecyclerView ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġexpand ableView : ĠExpand able Layout Ġ= ĠExpand able Layout ( v . context ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠChild Item ĠRecyclerView ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġre cyclerView : ĠRecyclerView Ġ= ĠRecyclerView ( v . context ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Ġ= ĠitemView . findViewById ( getRoot LinearLayout Id ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Please Ġuse ĠLinearLayout Ġas Ġthe Ġroot Ġlayout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand ableView . addView ( re cyclerView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader View . setOnClickListener Ġ{ Ġexpand ableView . toggle () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addView ( expand ableView , Ġroot . child Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand ableView . collapse () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand ableView . orientation Ġ= ĠExpand able Layout . VERTICAL ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen ĠViewHolder Ġbind s Ġwith ĠParent Item ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe ĠParent Item Ġto Ġbind Ġwith ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent View Pool ĠThe ĠRe cyc led View Pool Ġto Ġbe Ġset Ġfor Ġthe ĠChild Item ĠRecyclerView Ġfor Ġbetter ĠViewHolder Ġre - us ability ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġchild Adapter List ĠThe Ġlist Ġof ĠChild Adapter Ġin Ġthis ĠFilter Drawer ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠCallback Ġto ĠParent Adapter Ġwhen Ġthe Ġrelated ĠChild Adapter 's Ġselection Ġchanges . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġ< Parent , ĠChild > Ġbind View ( parent : ĠParent , Ġparent View Pool : ĠRecyclerView . Re cyc led View Pool , Ġchild Adapter List : ĠArrayList < Child Adapter < Parent , ĠChild >>, Ġcallback : Ġ( Set < Child >, ĠBoolean ) Ġ-> ĠUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ĠParent Ġ: ĠParent Item , ĠChild Ġ: ĠChild Item Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind View ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġfilter Ġre cycler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġll m Ġ= ĠLinearLayoutManager ( item View . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdid Ġ= ĠDiv ider Item Decoration ( item View . context , Ġll m . orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠChild Adapter ( parent , Ġparent . getChild Collection () Ġas ĠList < Child >) Ġ{ Ġchild Item , Ġselected Ġ-> Ġcallback ( child Item , Ġselected ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . set Re cyc led View Pool ( parent View Pool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= Ġll m ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( did ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . is Nested Scrolling Enabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Adapter List . add ( adapter Position , Ġadapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen ĠViewHolder Ġbind s Ġwith ĠParent Item ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe ĠParent Item Ġto Ġbind Ġwith ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġbind View ( parent : ĠParent Item ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġone Ġof Ġthe ĠChild Item Ġis Ġselected ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe ĠParent Item Ġthat Ġbound Ġwith Ġthis ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġchild Set ĠThe Ġcurrently Ġselected Ġset Ġof ĠChild Item ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Child Select ( parent : ĠParent Item , Ġchild Set : ĠSet < Child Item >) ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġone Ġof Ġthe ĠChild Item Ġis Ġde selected ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe ĠParent Item Ġthat Ġbound Ġwith Ġthis ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġchild Set ĠThe Ġcurrently Ġselected Ġset Ġof ĠChild Item ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Child De select ( parent : ĠParent Item , Ġchild Set : ĠSet < Child Item >) ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe ĠFilter Drawer Ġresets ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe ĠParent Item Ġthat Ġbound Ġwith Ġthis ĠViewHolder ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġon Reset ( parent : ĠParent Item ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHelper Ġmethod Ġfor ĠSup ply Ġcolor Ġfrom Ġcolor Ġresource ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcolor ĠThe Ġcolor Ġresource ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcolor ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Color (@ Color Res Ġcolor : ĠInt ) Ġ= ĠContext Compat . getColor ( item View . context , Ġcolor ) ĊĠĠĠ Ġ} Ċ }