package Ġcom . h xb reak . animal cross ing tools . adapter Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . paging . Paging Data Adapter Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġjava . lang . IllegalStateException Ċ Ċ interface ĠItem Comparable < T >{ ĊĠĠĠ Ġfun Ġid (): ĠT Ċ } Ċ Ċ internal Ġclass ĠPlace Holder View Binder Ġ: ĠItem View Delegate < Any , ĠPlace Holder View Binder . Place Holder ViewHolder >{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup ): ĠPlace Holder ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPlace Holder ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( android . R . layout . simple _ list _ item _ 1 , Ġparent , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( data : ĠAny ?, Ġv h : ĠPlace Holder ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġv h . view . findViewById < TextView >( android . R . id . text 1 ). text Ġ= Ġ" Place Holder " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPlace Holder ViewHolder ( val Ġview : ĠView ): ĠRecyclerView . ViewHolder ( view ) Ċ } Ċ Ċ class ĠPlace Holder Ċ Ċ data Ġclass ĠView Item Relation ( ĊĠĠĠ Ġval Ġclazz : ĠClass <* >, ĊĠĠĠ Ġval Ġdelegate : ĠItem View Delegate < Any , ĠRecyclerView . ViewHolder > Ċ ) Ċ Ċ interface ĠItem View Delegate < T , ĠV H : ĠRecyclerView . ViewHolder >{ ĊĊĠĠĠ Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup ): ĠV H ĊĊĠĠĠ Ġfun Ġon Bind ViewHolder ( data : ĠT ?, Ġv h : ĠV H ) Ċ Ċ } Ċ Ċ internal Ġobject ĠDefault Item Comparable Diff Util Ġ: ĠDiff Util . Item Callback < Item Comparable <* >>() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( ĊĠĠĠĠĠĠĠ Ġold Item : ĠItem Comparable <* >, ĊĠĠĠĠĠĠĠ Ġnew Item : ĠItem Comparable < *> ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . id () Ġ== Ġnew Item . id () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( ĊĠĠĠĠĠĠĠ Ġold Item : ĠItem Comparable <* >, ĊĠĠĠĠĠĠĠ Ġnew Item : ĠItem Comparable < *> ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . equals ( new Item ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ object ĠCommon Item Comparable Diff Util Ġ: ĠDiff Util . Item Callback < Any >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠAny , Ġnew Item : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( old Item Ġis ĠItem Comparable < *> Ġ&& Ġnew Item Ġis ĠItem Comparable < *> ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( old Item . java Class Ġ== Ġnew Item . java Class Ġ&& Ġold Item . id () Ġ== Ġnew Item . id ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Diff Util Equals ") ĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠAny , Ġnew Item : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠT yper Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġindexer Ġ= Ġmutable ListOf < View Item Relation >() ĊĊĠĠĠ Ġfun Ġregister ( clazz : ĠClass <* >, Ġdelegate : ĠItem View Delegate < *, Ġout ĠRecyclerView . ViewHolder > ){ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġindexer . add ( View Item Relation ( clazz , Ġdelegate Ġas ĠItem View Delegate < Any , ĠRecyclerView . ViewHolder > )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠItem Comparable <* >> Ġregister ( delegate : ĠItem View Delegate < T , Ġout ĠRecyclerView . ViewHolder > ){ ĊĠĠĠĠĠĠĠ Ġregister ( T :: class . java , Ġdelegate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ) Ġ= Ġindexer [ index ] ĊĊĠĠĠ Ġfun ĠindexOf First ( predicate : Ġ( View Item Relation ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindexer . indexOf First ( predicate ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLight Adapter ( val Ġty per : ĠT yper Ġ= ĠT yper (), Ġdiff Callback : ĠDiff Util . Item Callback < Item Comparable <* >> Ġ= ĠDefault Item Comparable Diff Util ): ĊĠĠĠ ĠList Adapter < Item Comparable <* >, ĠRecyclerView . ViewHolder >( diff Callback ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( Place Holder :: class . java , ĠPlace Holder View Binder ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister ( clazz : ĠClass <* >, Ġdelegate : ĠItem View Delegate < *, Ġout ĠRecyclerView . ViewHolder > ){ ĊĠĠĠĠĠĠĠ Ġty per . register ( clazz , Ġdelegate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠItem Comparable <* >> Ġregister ( delegate : ĠItem View Delegate < T , Ġout ĠRecyclerView . ViewHolder > ){ ĊĠĠĠĠĠĠĠ Ġty per . register ( T :: class . java , Ġdelegate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġty per [ getItem ViewType ( position )]. delegate . on Bind ViewHolder ( getItem ( position ) Ġas ĠAny ?, Ġholder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġty per [ view Type ]. delegate . onCreate ViewHolder ( parent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġindex ViewType ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġindex ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= ĠgetItem ( position )?. java Class Ġ?: ĠPlace Holder :: class . java ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġty per . indexOf First Ġ{ Ġit . clazz . isAssignableFrom ( clazz ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" view Type Ġcannot Ġlocate Ġclass :$ clazz ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ // class ĠP aging Light Adapter : ĠP aging Data Adapter < Item Comparable <* >, ĠRecyclerView . ViewHolder > Ġ{ Ċ // Ċ // ĠĠĠ Ġconstructor ( diff Callback : ĠDiff Util . Item Callback < Item Comparable <* >> Ġ= ĠDefault Item Comparable Diff Util ) Ġ: Ġsuper ( diff Callback ) Ġ{} Ċ // Ċ // ĠĠĠ Ġprivate Ġval Ġindexer Ġ= Ġmutable ListOf < View Item Relation >() Ċ // Ċ // ĠĠĠ Ġinit Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġregister ( Place Holder :: class . java , ĠPlace Holder View Binder ()) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġfun Ġregister ( clazz : ĠClass <* >, Ġdelegate : ĠItem View Delegate < *, Ġout ĠRecyclerView . ViewHolder > ){ Ċ // ĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ċ // ĠĠĠĠĠĠĠ Ġindexer . add ( View Item Relation ( clazz , Ġdelegate Ġas ĠItem View Delegate < Any , ĠRecyclerView . ViewHolder > )) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠItem Comparable <* >> Ġregister ( delegate : ĠItem View Delegate < T , Ġout ĠRecyclerView . ViewHolder > ){ Ċ // ĠĠĠĠĠĠĠ Ġregister ( T :: class . java , Ġdelegate ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġindexer [ getItem ViewType ( position )]. delegate . on Bind ViewHolder ( getItem ( position ) Ġas ĠAny ?, Ġholder ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġindexer [ view Type ]. delegate . onCreate ViewHolder ( parent ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġindex ViewType ( position ) Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġprivate Ġfun Ġindex ViewType ( position : ĠInt ): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= ĠgetItem ( position )?. java Class Ġ?: ĠPlace Holder :: class . java Ċ // ĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġindexer . indexOf First Ġ{ Ġit . clazz . isAssignableFrom ( clazz ) Ġ} Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġindex Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" view Type Ġcannot Ġlocate Ġclass :$ clazz ") Ċ // ĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġfun Ġall () Ġ= Ġ( 0 Ġuntil Ġitem Count ). map Ġ{ ĠgetItem ( it ) Ġ} Ċ // Ċ //}