package Ġio . n ich ij ou . t uj ian . common . ext Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ Ċ fun Ġ< T > ĠRecyclerView . add New ( new Data : ĠList < T > ?, Ġreset : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠ Ġif Ġ( new Data Ġ== Ġnull ) Ġreturn ĊĠ Ġ( this . adapter Ġas ? ĠRe cycler Adapter < T > ?) ?. add ( new Data , Ġreset ) ĊĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" you Ġneed Ġuse ĠRecyclerView . with () Ġinit ĠRecyclerView ") Ċ } Ċ Ċ fun Ġ< T > ĠRecyclerView . reset Data ( new Data : ĠList < T > ?) Ġ{ ĊĠ Ġif Ġ( new Data Ġ== Ġnull ) Ġreturn ĊĠ Ġ( this . adapter Ġas ? ĠRe cycler Adapter < T > ?) ?. reset ( new Data ) ĊĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" you Ġneed Ġuse ĠRecyclerView . with () Ġinit ĠRecyclerView ") Ċ } Ċ Ċ fun ĠRecyclerView . clear List () Ġ{ ĊĠ Ġ( this . adapter Ġas ? ĠRe cycler Adapter < *> ?) ?. clear () ĊĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" you Ġneed Ġuse ĠRecyclerView . with () Ġinit ĠRecyclerView ") Ċ } Ċ Ċ fun Ġ< T > ĠRecyclerView . getList (): ĠMutable List < T > Ġ{ ĊĠ Ġreturn Ġ( this . adapter Ġas ? ĠRe cycler Adapter < T > ?) ?. data () ĊĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" you Ġneed Ġuse ĠRecyclerView . with () Ġinit ĠRecyclerView ") Ċ } Ċ Ċ fun Ġ< T > ĠRecyclerView . notify Items Changed () Ġ{ ĊĠ Ġ( this . adapter Ġas ? ĠRe cycler Adapter < T > ?) ?. notify Items Changed () ĊĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" you Ġneed Ġuse ĠRecyclerView . with () Ġinit ĠRecyclerView ") Ċ } Ċ Ċ fun Ġ< T > ĠRecyclerView . with ( ĊĠ Ġ@ Layout Res Ġlayout Res : ĠInt , ĊĠ Ġdata : ĠMutable List < T > Ġ= ĠArrayList (), ĊĠ Ġview Type Matching : Ġ( bean : ĠT , Ġlayout Res Id : ĠInt ) Ġ-> ĠBoolean Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġtrue Ġ}, ĊĠ Ġbind : Ġ( View .( bean : ĠT , Ġpos : ĠInt ) Ġ-> ĠUnit )? Ċ ): ĠRe cycler Adapter < T > Ġ= ĠRe cycler Adapter ( this , Ġdata ). with ( layout Res , Ġview Type Matching , Ġbind ) Ċ Ċ class ĠRe cycler Adapter < T >( private Ġval Ġre cycler : ĠRecyclerView , Ġprivate Ġval Ġdata : ĠMutable List < T >) Ġ: ĊĠ ĠRecyclerView . Adapter < ViewHolder < T >>() Ġ{ ĊĠ Ġprivate Ġvar Ġitems Ġ= ĠArrayList < Item Cache < T >>() ĊĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder < T > Ġ{ ĊĠĠĠ Ġreturn ĠViewHolder ( ĊĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ). inflate ( items . first Ġ{ Ġit . layout Res Ġ== Ġview Type Ġ}. layout Res , Ġparent , Ġfalse ), Ġview Type ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder < T >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠ Ġholder . bind View ( data [ position ], Ġitems . first Ġ{ Ġit . layout Res Ġ== Ġholder . view Type Ġ}. bind ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġdata . size ĊĊĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ) Ġ= Ġitems . first Ġ{ Ġit . matching ( data [ position ], Ġit . layout Res ) Ġ}. layout Res ĊĊĠ Ġfun Ġwith (@ Layout Res Ġlayout Res : ĠInt , Ġview Type Matching : Ġ( bean : ĠT , Ġlayout Res Id : ĠInt ) Ġ-> ĠBoolean , Ġbind : Ġ( View .( bean : ĠT , Ġpos : ĠInt ) Ġ-> ĠUnit )? Ġ= Ġnull ): ĠRe cycler Adapter < T > Ġ{ ĊĠĠĠ Ġitems . add ( Item Cache ( layout Res , Ġview Type Matching , Ġbind )) ĊĠĠĠ Ġre cycler . adapter Ġ= Ġthis ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġdata () Ġ= Ġdata ĊĠ Ġfun Ġadd ( new Data : ĠList < T >, Ġreset : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġif Ġ( reset ) Ġ{ ĊĠĠĠĠĠ Ġreset ( new Data ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġsize Ġ= Ġdata . size ĊĠĠĠĠĠ Ġdata . addAll ( new Data ) ĊĠĠĠĠĠ Ġnotify Item Range Inserted ( size , ĠnewData . size ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġreset ( new Data : ĠList < T >) Ġ{ ĊĠĠĠ Ġdata . clear () ĊĠĠĠ Ġdata . addAll ( new Data ) ĊĠĠĠ Ġnotify DataSet Changed () ĊĠ Ġ} ĊĊĠ Ġfun Ġnotify Items Changed () Ġ{ ĊĠĠĠ Ġnotify Item Range Changed ( 0 , Ġdata . size ) ĊĠ Ġ} ĊĊĠ Ġfun Ġclear () Ġ{ ĊĠĠĠ Ġdata . clear () ĊĠĠĠ Ġnotify DataSet Changed () ĊĠ Ġ} Ċ } Ċ Ċ class ĠItem Cache < T >( ĊĠ Ġ@ Layout Res Ġval Ġlayout Res : ĠInt , ĊĠ Ġval Ġmatching : Ġ( T , ĠInt ) Ġ-> ĠBoolean , ĊĠ Ġval Ġbind : Ġ( View .( T , ĠInt ) Ġ-> ĠUnit )? Ċ ) Ċ Ċ class ĠViewHolder < T >( item View : ĠView , Ġval Ġview Type : ĠInt ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠ Ġfun Ġbind View ( entity : ĠT , Ġbind : Ġ( View .( T , ĠInt ) Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠ Ġadapter Position ĊĠĠĠ ĠitemView . apply Ġ{ ĊĠĠĠĠĠ Ġbind ?. invoke ( this , Ġentity , Ġadapter Position ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ