package Ġnet . dan le w . counter . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . support . v 7 . util . Diff Util Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . jak ew h art on . rx relay 2 . Publish Relay Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġnet . dan le w . counter . data . Counter Ċ import Ġnet . dan le w . counter . data . Counter Change Ċ Ċ class ĠCounter Adapter ( private Ġval Ġcontext : ĠContext ) Ġ: ĠRecyclerView . Adapter < Counter ViewHolder >() Ġ{ ĊĊĠ Ġprivate Ġvar Ġdata : ĠList < Counter > Ġ= Ġempty List () ĊĊĠ Ġprivate Ġval Ġchanges Ġ= ĠPublish Relay . create < Counter Change >() ĊĊĠ Ġprivate Ġval Ġlistener Ġ= Ġobject Ġ: ĠCounter ViewHolder . Listener Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Counter Change ( counter Change : ĠCounter Change ) Ġ= Ġchanges . accept ( counter Change ) ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġset Has Stable Ids ( true ) ĊĠ Ġ} ĊĊĠ Ġfun Ġchanges (): ĠObservable < Counter Change > Ġ= Ġchanges . hide () ĊĊĠ Ġfun Ġbind ( source : ĠFlow able < List < Counter >> ): ĠDis posable Ġ{ ĊĠĠĠ Ġdata Ġclass ĠData With Diff ( val Ġcounters : ĠList < Counter >, Ġval Ġdiff : ĠDiff Util . Diff Result ?) ĊĊĠĠĠ Ġreturn Ġsource ĊĠĠĠĠĠĠĠ Ġ. scan ( Data With Diff ( emptyList (), Ġnull )) Ġ{ Ġ( old ), Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠData With Diff ( new , ĠDiff Util . calculate Diff ( Diff Callback ( old , Ġnew ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġit . counters ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . diff Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . diff . dispatch Updates To ( this ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ) Ġ= ĠCounter ViewHolder ( context , Ġparent ) ĊĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠCounter ViewHolder , Ġposition : ĠInt ) Ġ= Ġholder . bind ( data [ position ], Ġlistener ) ĊĊĠ Ġoverride Ġfun Ġon View Detached From Window ( holder : ĠCounter ViewHolder ) Ġ= Ġholder . detach () ĊĊĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġdata . size ĊĊĠ Ġoverride Ġfun ĠgetItem Id ( position : ĠInt ) Ġ= Ġdata [ position ]. id ĊĊĠ Ġfun Ġget Position ( itemId : ĠLong ) Ġ= Ġdata . indexOf First Ġ{ Ġit . id Ġ== ĠitemId Ġ} ĊĊĠ Ġprivate Ġclass ĠDiff Callback ( private Ġval Ġold : ĠList < Counter >, Ġprivate Ġval Ġnew : ĠList < Counter >) Ġ: ĠDiff Util . Callback () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Old List Size () Ġ= Ġold . size ĊĊĠĠĠ Ġoverride Ġfun Ġget New List Size () Ġ= Ġnew . size ĊĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ) ĊĠĠĠĠĠĠĠ Ġ= Ġold [ old Item Position ]. id Ġ== Ġnew [ new Item Position ]. id ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ) ĊĠĠĠĠĠĠĠ Ġ= Ġold [ old Item Position ] Ġ== Ġnew [ new Item Position ] ĊĠ Ġ} Ċ }