package Ġcom . h library . adapter . recycler čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . view . View č Ċ import Ġandroidx . databinding . ViewData Binding č Ċ import Ġcom . h library . adapter . model . Head Foot Adapter Vo č Ċ import Ġcom . h library . adapter . model . RecyclerView Holder čĊč Ċ /** čĊ Ġ* ĠCreated Ġby Ġlin wen h ui Ġon Ġ 2 0 1 5 / 9 / 2 9 . čĊ Ġ*/ č Ċ abstract Ġclass ĠExpand Recycler Adapter < T , ĠH Vo Ġ: ĠHead Foot Adapter Vo < T > ?, ĠF Vo Ġ: ĠHead Foot Adapter Vo < T >? >( context : ĠContext ?, Ġlayout Id : ĠInt ) Ġ: ĠObject Base Recycler Adapter < T , ĠView Data Binding >( context , Ġlayout Id ) Ġ{ čĊĠĠĠ Ġprivate Ġval Ġhead Layout Ids : ĠMutable List < H Vo > Ġ= ĠArrayList () čĊĠĠĠ Ġprivate Ġval Ġfoot Layout Ids : ĠMutable List < F Vo > Ġ= ĠArrayList () čĊĠĠĠ Ġprivate Ġvar Ġon Head ItemClickListener : ĠOn ItemClickListener < H Vo >? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġvar Ġon Foot ItemClickListener : ĠOn ItemClickListener < F Vo >? Ġ= Ġnull čĊĠĠĠ Ġprivate Ġval Ġhead Event Imp : ĠExpand Event Imp < H Vo > čĊĠĠĠ Ġprivate Ġval Ġfoot Event Imp : ĠExpand Event Imp < F Vo > čĊčĊĠĠĠ Ġfun Ġadd Header Object ( t : ĠH Vo ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Layout Ids . add ( t ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Header Object ( pos : ĠInt , Ġt : ĠH Vo ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ- 1 Ġ&& Ġpos Ġ< Ġhead Count Ġ&& Ġt Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Layout Ids . add ( pos , Ġt ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġremove Header Object ( t : ĠH Vo ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Layout Ids . remove ( t ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġremove Header Object ( pos : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ- 1 Ġ&& Ġpos Ġ< Ġhead Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Layout Ids . remove At ( pos ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Header All ( ts : ĠCollection < H Vo > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( ts ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Layout Ids . addAll ( ts ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Header All ( pos : ĠInt , Ġts : ĠCollection < H Vo > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ- 1 Ġ&& Ġpos Ġ< Ġhead Count Ġ&& Ġts ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Layout Ids . addAll ( pos , Ġts ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġremove Header All () Ġ{ čĊĠĠĠĠĠĠĠ Ġhead Layout Ids . clear () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Footer Object ( t : ĠF Vo ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfoot Layout Ids . add ( t ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Footer Object ( pos : ĠInt , Ġt : ĠF Vo ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ- 1 Ġ&& Ġpos Ġ< Ġfoot Count Ġ&& Ġt Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfoot Layout Ids . add ( pos , Ġt ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġremove Footer Object ( t : ĠF Vo ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfoot Layout Ids . remove ( t ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġremove Footer Object ( pos : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ- 1 Ġ&& Ġpos Ġ< Ġfoot Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfoot Layout Ids . remove At ( pos ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Footer All ( ts : ĠCollection < F Vo > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( ts ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfoot Layout Ids . addAll ( ts ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Footer All ( pos : ĠInt , Ġts : ĠCollection < F Vo > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġ- 1 Ġ&& Ġpos Ġ< Ġfoot Count Ġ&& Ġts ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfoot Layout Ids . addAll ( pos , Ġts ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġremove Footer All () Ġ{ čĊĠĠĠĠĠĠĠ Ġfoot Layout Ids . clear () čĊĠĠĠ Ġ} čĊčĊčĊĠĠĠ Ġfun Ġset On Head ItemClickListener ( on Head ItemClickListener : ĠOn ItemClickListener < H Vo > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . on Head ItemClickListener Ġ= Ġon Head ItemClickListener čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġset On Foot ItemClickListener ( on Foot ItemClickListener : ĠOn ItemClickListener < F Vo > ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġthis . on Foot ItemClickListener Ġ= Ġon Foot ItemClickListener čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem Count () Ġ+ Ġhead Count Ġ+ Ġfoot Count čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġhead Count : ĠInt čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġhead Layout Ids . size čĊčĊĠĠĠ Ġfun Ġget Head Item ( position : ĠInt ): ĠH Vo Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġhead Layout Ids [ position ] čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġfoot Count : ĠInt čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfoot Layout Ids . size čĊčĊĠĠĠ Ġfun Ġget Foot Item ( position : ĠInt ): ĠF Vo Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġfoot Layout Ids [ position ] čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun ĠgetItem ( position : ĠInt ): ĠT ? Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem ( position Ġ- Ġhead Count ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView Holder < ViewData Binding >, Ġposition : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhead Layout Num Ġ= Ġhead Count čĊĠĠĠĠĠĠĠ Ġval Ġfoot Layout Num Ġ= Ġfoot Count čĊĠĠĠĠĠĠĠ Ġval Ġrelative Foot Pos Ġ= Ġposition Ġ- Ġhead Layout Num Ġ- Ġsuper . getItem Count () čĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ>= Ġ 0 Ġ&& Ġposition Ġ< Ġhead Layout Num ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind Head ViewHolder ( holder , Ġposition ) čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( relative Foot Pos Ġ>= Ġ 0 Ġ&& Ġrelative Foot Pos Ġ< Ġfoot Layout Num ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind Foot ViewHolder ( holder , Ġrelative Foot Pos ) čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Bind ViewHolder ( holder , Ġposition ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind ViewHolder New ( holder , Ġposition Ġ- Ġhead Layout Num ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġon Bind ViewHolder New ( holder : ĠRecyclerView Holder < ViewData Binding >, Ġposition : ĠInt ) Ġ{ čĊčĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġon Bind Head ViewHolder ( holder : ĠRecyclerView Holder < ViewData Binding >, Ġposition : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġholder . item View . tag Ġ= Ġposition čĊĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener ( head Event Imp ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġon Bind Foot ViewHolder ( holder : ĠRecyclerView Holder < ViewData Binding >, Ġposition : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġholder . item View . tag Ġ= Ġposition čĊĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener ( foot Event Imp ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfinal Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhead Layout Num Ġ= Ġhead Count čĊĠĠĠĠĠĠĠ Ġval Ġfoot Layout Num Ġ= Ġfoot Count čĊĠĠĠĠĠĠĠ Ġval Ġrelative Foot Pos Ġ= Ġposition Ġ- Ġhead Layout Num Ġ- Ġsuper . getItem Count () čĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( position Ġ>= Ġ 0 Ġ&& Ġposition Ġ< Ġhead Layout Num ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Head Item ( position ) !!. layout Res Id čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( relative Foot Pos Ġ>= Ġ 0 Ġ&& Ġrelative Foot Pos Ġ< Ġfoot Layout Num ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Foot Item ( relative Foot Pos ) !!. layout Res Id čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem ViewType New ( position ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun ĠgetItem ViewType New ( position : ĠInt ): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem ViewType ( position ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġabstract Ġinner Ġclass ĠExpand Event Imp < T >( adapter : ĠExpand Recycler Adapter < *, ĠH Vo , ĠF Vo > ?) Ġ: ĠEvent Imp < T , ĠExpand Recycler Adapter < *, ĠH Vo , ĠF Vo >? >( adapter ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġget On ItemClickListener ( adapter : ĠExpand Recycler Adapter < *, ĠH Vo , ĠF Vo >? ): ĠOn ItemClickListener < T >? čĊčĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Click ( v : ĠView ?, Ġpost ion : ĠInt , Ġbean : ĠT ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Weak Reference Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġadapter Weak Reference ?. get () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem ClickListener Ġ= Ġget On ItemClickListener ( adapter ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ClickListener ?. on Item Click ( v , Ġpost ion , Ġbean ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġhead Event Imp Ġ= Ġobject Ġ: ĠExpand Event Imp < H Vo >( this ) Ġ{ čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Event Item ( pos : ĠInt ): ĠH Vo ? Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Head Item ( pos ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget On ItemClickListener ( adapter : ĠExpand Recycler Adapter < *, ĠH Vo , ĠF Vo >? ): ĠOn ItemClickListener < H Vo >? Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadapter ?. on Head ItemClickListener čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfoot Event Imp Ġ= Ġobject Ġ: ĠExpand Event Imp < F Vo >( this ) Ġ{ čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Event Item ( pos : ĠInt ): ĠF Vo ? Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Foot Item ( pos ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget On ItemClickListener ( adapter : ĠExpand Recycler Adapter < *, ĠH Vo , ĠF Vo >? ): ĠOn ItemClickListener < F Vo >? Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadapter ?. on Foot ItemClickListener čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }