package Ġme . sun ny day dev . mv vm kit . binding Ċ Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . core . view . get Ċ import Ġandroidx . databinding . Binding Adapter Ċ import Ġandroidx . databinding . adapters . Listener Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġcom . github . nit ric o . last adapter . BaseType Ċ import Ġcom . github . nit ric o . last adapter . Last Adapter Ċ import Ġcom . github . nit ric o . last adapter . Type Handler Ċ import Ġme . sun ny day dev . mv vm kit . R Ċ import Ġme . sun ny day dev . mv vm kit . binding . internal . Bind able Core Ċ import Ġme . sun ny day dev . mv vm kit . observable . Command Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġsun ny Ġon Ġ 3 1 . 0 5 . 2 0 1 8 . Ċ Ġ* Ġmail : Ġmail @ sun ny day dev . me Ċ Ġ*/ Ċ Ċ object ĠRecyclerView Bindings : ĠBind ings () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcore Tag Ġby Ġlazy Ġ{ ĠView Compat . generate View Id () Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠCommands ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" scrollTo Position ") ĊĠĠĠ Ġfun Ġbind Scroll To Position ( view : ĠRecyclerView , Ġposition : ĠCommand < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition . handle ( view :: scrollTo Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" reset Adapter Command ") ĊĠĠĠ Ġfun Ġbind Reset Adapter ( view : ĠRecyclerView , Ġcommand : ĠCommand < Unit >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommand . handle Ġ{ Ġview . adapter Ġ= Ġview . adapter Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠItems ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" items ") ĊĠĠĠ Ġfun Ġ< T : ĠAny > Ġbind Items ( view : ĠRecyclerView , Ġitems : ĠList < T >) Ġ= Ġview . adapter Core . set Items ( items ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" items Layout Map ") ĊĠĠĠ Ġfun Ġbind Items Map ( view : ĠRecyclerView , Ġmap : ĠItems Map ) Ġ= Ġview . adapter Core . set Items Map ( map ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" items Stable Id ") ĊĠĠĠ Ġfun Ġbind Items Stable Id ( view : ĠRecyclerView , Ġstable Id : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . adapter Core . set Stable Id ( stable Id ) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Item Moved ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Item Action StateChanged ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" can Item Drop Over " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire All Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġbind Item Moved Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmoved Callback : ĠOn Touch Item Moved Callback ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction State Callback : ĠOn Touch Item Action State Callback ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Over Callback : ĠOn Touch Item Can Drop Over Callback ? ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠListener Util . get Listener < Item Touch Helper >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĠR . id . binding _ recyclerview _ touch _ item _ helper ĊĠĠĠĠĠĠĠ Ġ) ?. attach To RecyclerView ( null ) ĊĠĠĠĠĠĠĠ ĠListener Util . track Listener ( view , Ġnull , ĠR . id . binding _ recyclerview _ touch _ item _ helper ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( moved Callback Ġ== Ġnull Ġ&& Ġaction State Callback Ġ== Ġnull Ġ&& Ġdrop Over Callback Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġitem Touch Callback Ġ= Ġobject Ġ: ĠItem Touch Helper . Callback () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Movement Flags ( re cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrag Flags Ġ= ĠItem Touch Helper . UP Ġor ĠItem Touch Helper . DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmake Movement Flags ( drag Flags , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Move ( re cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget : ĠRecyclerView . ViewHolder ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmoved Callback ?. on Item Moved ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . adapter Position , Ġtarget . adapter Position ) Ġ?: Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġdirection : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Drop Over ( re cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent : ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget : ĠRecyclerView . ViewHolder ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Over Callback ?. can Drop Over ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . adapter Position , Ġtarget . adapter Position ) Ġ?: Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Long Press Drag Enabled (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Item View Swipe Enabled (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Selected Changed ( view Holder : ĠRecyclerView . ViewHolder ?, Ġaction State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Selected Changed ( view Holder , Ġaction State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction State Callback ?. on Item Selection Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . adapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Action State . parse ( action State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclear View ( re cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . clear View ( re cyclerView , ĠviewHolder ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction State Callback ?. on Item Selection Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . adapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Action State . IDLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhelper Ġ= ĠItem Touch Helper ( item Touch Callback ) ĊĊĠĠĠĠĠĠĠ ĠListener Util . track Listener ( view , Ġhelper , ĠR . id . binding _ recyclerview _ touch _ item _ helper ) ĊĊĠĠĠĠĠĠĠ Ġhelper . attach To RecyclerView ( view ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠItem Decoration ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" item Decoration ") ĊĠĠĠ Ġfun Ġbind Item Decoration ( view : ĠRecyclerView , Ġdecoration : ĠRecyclerView . Item Decoration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġremove Ġprevious ĊĠĠĠĠĠĠĠ Ġview . addItem Decoration ( decoration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter (" item Decor ations ") ĊĠĠĠ Ġfun Ġbind Item Decor ations ( view : ĠRecyclerView , Ġdecoration : ĠList < RecyclerView . Item Decoration >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġremove Ġprevious ĊĠĠĠĠĠĠĠ Ġdecoration . forEach ( view :: addItem Decoration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Binding Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ[ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Visible Items Positions Changed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on First Visible Items Positions Changed ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Last Visible Item Positions Changed " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire All Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġbind Last Visible Position ( view : ĠRecyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠAdapter Position Listener . Callback ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst : ĠAdapter Position Listener . Single Callback ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast : ĠAdapter Position Listener . Single Callback ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent : ĠAdapter Position Listener ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠListener Util . get Listener ( view , ĠR . id . binding _ recyclerview _ binding _ visible _ position ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current ?. is Same ( callback , Ġfirst , Ġlast ) Ġ== Ġtrue ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġcurrent ?. also ( view :: remove On Scroll Listener ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Listener Ġ= ĠAdapter Position Listener ( callback , Ġfirst , Ġlast ) ĊĊĠĠĠĠĠĠĠ Ġview . add On Scroll Listener ( new Listener ) ĊĊĠĠĠĠĠĠĠ ĠListener Util . track Listener ( view , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Listener , ĠR . id . binding _ recyclerview _ binding _ visible _ position ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠRecyclerView . first Visible Item Position : ĠInt Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ== Ġ 0 ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġfirst View Ġ= Ġthis [ 0 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġget Child Adapter Position ( first View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠRecyclerView . last Visible Item Position : ĠInt Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ== Ġ 0 ) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġlast View Ġ= Ġthis [ child Count Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġget Child Adapter Position ( last View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAdapter Position Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcallback : ĠCallback ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfirst Callback : ĠAdapter Position Listener . Single Callback ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlast Callback : ĠAdapter Position Listener . Single Callback ? ĊĠĠĠ Ġ): ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġhandled First : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġhandled Last : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Same ( callback : ĠCallback ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst : ĠAdapter Position Listener . Single Callback ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast : ĠAdapter Position Listener . Single Callback ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ== Ġthis . callback Ġ&& Ġfirst Ġ== Ġfirst Callback Ġ&& Ġlast Ġ== Ġlast Callback ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġre cyclerView . first Visible Item Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġre cyclerView . last Visible Item Position ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Changed Ġ= Ġhandled First Ġ!= Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Changed Ġ= Ġhandled Last Ġ!= Ġlast ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Callback Ġ!= Ġnull Ġ&& Ġfirst Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Callback . on Item Visible Position Changed ( first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Callback Ġ!= Ġnull Ġ&& Ġlast Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Callback . on Item Visible Position Changed ( last ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ!= Ġnull Ġ&& Ġ( first Changed Ġ|| Ġlast Changed )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Items Visible Position Changed ( first , Ġlast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Changed ) Ġhandled First Ġ= Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Changed ) Ġhandled Last Ġ= Ġlast ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinterface ĠCallback Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Items Visible Position Changed ( first : ĠInt , Ġlast : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinterface ĠSingle Callback Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Item Visible Position Changed ( position : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠRecyclerView . adapter Core Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġget Or Set Listener ( R . id . binding _ recyclerview _ adapter _ core ) Ġ{ ĠAdapter Core ( this ) Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠClasses ĊĊĠĠĠ Ġinternal Ġclass ĠAdapter Core ( private Ġval Ġview : ĠRecyclerView ): ĠBind able Core () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitems : ĠWeak Reference < List < Any >> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstable Id : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitems Map : ĠWeak Reference < Items Map >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T : ĠAny > Ġset Items ( items : ĠList < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . items ?. get () Ġ=== Ġitems ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . items Ġ= ĠWeak Reference ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Changed ( items Map ?. get () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Items Map ( map : ĠItems Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . items Map ?. get ()?. id Ġ== Ġmap . id ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . items Map Ġ= ĠWeak Reference ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Changed ( items ?. get () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Stable Id ( stable Id : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . stable Id Ġ== Ġstable Id ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stable Id Ġ= Ġstable Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Changes () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġthis . items ?. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Map Ġ= Ġthis . items Map ?. get () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items Ġ== Ġnull Ġ|| Ġitems Map Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġobject Ġ: ĠType Handler Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġalternate Ġ= Ġmutable Map Of < K Class < out ĠAny >, ĠItems Map . Item >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Type ( item : ĠAny , Ġposition : ĠInt ): ĠBase Type ? Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkl azz Ġ= Ġitem :: class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Mapping Ġ= Ġitems Map . map [ kl azz ] Ġ?: Ġalternate [ kl azz ] Ġ?: Ġitems Map . map . keys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single Ġ{ Ġit . java . isAssignableFrom ( kl azz . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġalternate [ kl azz ] Ġ= Ġitems Map . map [ it ] !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġalternate [ kl azz ] !! Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBase Type ( item Mapping . layout , Ġitem Mapping . variable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . adapter Ġ= ĠLast Adapter ( items , Ġstable Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. handler ( handler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( view ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Touch Item Moved Callback Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Item Moved ( from Index : ĠInt , Ġto Index : ĠInt ): ĠBoolean ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Touch Item Action State Callback Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Item Selection Changed ( position : ĠInt , Ġtype : ĠItem Touch Action State ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Touch Item Can Drop Over Callback Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcan Drop Over ( current : ĠInt , Ġtarget : ĠInt ): ĠBoolean ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠItem Touch Action State Ġ{ ĊĊĠĠĠĠĠĠĠ ĠDR AG , ĠS WI PE , ĠID LE ; ĊĊĠĠĠĠĠĠĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse ( action : ĠInt ): ĠItem Touch Action State Ġ= Ġwhen ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Helper . ACTION _ STATE _ DR AG Ġ-> ĠDR AG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Helper . ACTION _ STATE _ SW I PE Ġ-> ĠS WI PE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠID LE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠAdapter Info < T >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter : ĠWeak Reference < Last Adapter >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems : ĠWeak Reference < List < T >>, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Map : ĠWeak Reference < Items Map > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( adapter : ĠLast Adapter , Ġitems : ĠList < T >, Ġmap : ĠItems Map ): ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( Weak Reference ( adapter ) Ġ, Weak Reference ( items ), ĠWeak Reference ( map )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠItems Map Ġ( internal Ġval Ġid : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġmap Ġ= Ġmutable Map Of < K Class < out ĠAny >, ĠItem >() ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT : ĠAny > Ġmap ( variable : ĠInt , Ġlayout : ĠInt ): ĠItems Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap ( T :: class , Ġvariable Ġ= Ġvariable , Ġlayout Ġ= Ġlayout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T : ĠAny > Ġmap ( clazz : ĠK Class < T >, Ġvariable : ĠInt , Ġlayout : ĠInt ): ĠItems Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ clazz ] Ġ= ĠItem ( variable Ġ= Ġvariable , Ġlayout Ġ= Ġlayout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout : ĠInt ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region Ċ Ċ }