package Ġcom . ja um ard . recyclerview binding Ċ Ċ import Ġandroid . databinding . Data Binding Util Ċ import Ġandroid . databinding . Observable ArrayList Ċ import Ġandroid . databinding . Observable List Ċ import Ġandroid . databinding . Observable List . On List Changed Callback Ċ import Ġandroid . databinding . ViewData Binding Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ open Ġclass ĠBind able Recycler Adapter < T >( items : ĠList < T > ?, Ġprivate Ġvar Ġitem Binder : ĠMultiple Type Item Binder ) Ġ: ĠRecyclerView . Adapter < Bind able Recycler Adapter . ViewHolder >() Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġinflater : ĠLayoutInflater ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠonClick Listener : ĠOn ClickListener < T >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġcallback Ġby Ġlazy Ġ{ ĠWeak Reference On List Changed Callback ( this ) Ġ} ĊĠĠĠ Ġval Ġitems Ġ= ĠObservable ArrayList < T >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( items Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . items . addAll ( items ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( in flater Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠData Binding Util . inflate < ViewData Binding >( in flater !! , Ġitem Binder . getItem Layout ( view Type ), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( binding ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitem Binder . getItem Type (( items [ position ] Ġas ĠT ) !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= Ġholder . binding ĊĠĠĠĠĠĠĠ Ġbinding . set Variable ( item Binder . variable Id , Ġitems [ position ]) ĊĠĠĠĠĠĠĠ Ġfor Ġ( data Ġin Ġitem Binder . additional Variables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . set Variable ( data . first !! , Ġdata . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . root . tag Ġ= Ġitems [ position ] ĊĠĠĠĠĠĠĠ Ġif Ġ( on ClickListener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . setOnClickListener Ġ{ Ġview Ġ-> ĠonClick Listener !!. onClick ( view . tag Ġas ĠT ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġthis . items . add On List Changed Callback ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġthis . items . remove On List Changed Callback ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitems . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Items ( items : ĠList < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . items . remove On List Changed Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġthis . items . clear () ĊĠĠĠĠĠĠĠ Ġthis . items . addAll ( items ) ĊĠĠĠĠĠĠĠ Ġthis . items . add On List Changed Callback ( callback ) ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Item Binder ( item Binder : ĠMultiple Type Item Binder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . item Binder Ġ= Ġitem Binder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠViewHolder Ġinternal Ġconstructor ( val Ġbinding : ĠView Data Binding ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) ĊĊĠĠĠ Ġfun Ġset OnClickListener ( on ClickListener : ĠOn ClickListener < T > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on ClickListener Ġ= ĠonClick Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠWeak Reference On List Changed Callback < T >( binding RecyclerView Adapter : ĠBind able Recycler Adapter < T >) Ġ: ĠOn List Changed Callback < Observable List < T >>() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġadapter Reference : ĠWeak Reference < Bind able Recycler Adapter <* >> Ġ= ĠWeak Reference ( binding RecyclerView Adapter ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( sender : ĠObservable List < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġadapter Reference . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Changed ( sender : ĠObservable List < T >, Ġposition Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġadapter Reference . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. notify Item Range Changed ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( sender : ĠObservable List < T >, Ġposition Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġadapter Reference . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. notify Item Range Inserted ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Moved ( sender : ĠObservable List < T >, Ġfrom Position : ĠInt , Ġto Position : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġadapter Reference . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. notify Item Moved ( from Position , Ġto Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Removed ( sender : ĠObservable List < T >, Ġposition Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= Ġadapter Reference . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. notify Item Range Removed ( position Start , Ġitem Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn ClickListener < in ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonClick ( item : ĠT ) ĊĠĠĠ Ġ} Ċ } Ċ