package Ġcom . w uh en zh iz ao . adapter Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . databinding . Data Binding Util Ċ import Ġandroid . databinding . On Re bind Callback Ċ import Ġandroid . databinding . ViewData Binding Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . w uh en zh iz ao . adapter . holder . RecyclerView Binding Holder Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġli ufe i Ġon Ġ 2 0 1 7 / 1 2 / 4 . Ċ Ġ*/ Ċ open Ġclass ĠRecyclerView Binding Adapter < T Ġ: ĠAny >( context : ĠContext , Ġitems : ĠList < T > ?) Ġ: ĠAbs RecyclerView Adapter < T , ĠRecyclerView Binding Holder < ViewData Binding >>( context , Ġitems ) Ġ{ ĊĠĠĠ Ġprivate Ġval ĠDATA _ INVALID ATION Ġ= ĠAny () ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġitems . size ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup ?, Ġview Type : ĠInt ): ĠRecyclerView Binding Holder < ViewData Binding > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠData Binding Util . inflate < ViewData Binding >( in flater , Ġview Type , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġholder Ġ= ĠRecyclerView Binding Holder ( binding ) ĊĠĠĠĠĠĠĠ Ġbinding . add On Re bind Callback ( object Ġ: ĠOn Re bind Callback < ViewData Binding >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Bind ( binding : ĠView Data Binding ): ĠBoolean Ġ= Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView !!. is Comp uting Layout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Canceled ( binding : ĠView Data Binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView !!. is Comp uting Layout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġholder . adapter Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position , ĠDATA _ INVALID ATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġinner Holder Create Listener ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonCreate ViewHolder ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġholder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView Binding Holder < ViewData Binding >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinner ClickListener ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick ( holder , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinner Long ClickListener ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Long Click ( holder , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinner Holder Bind Listener ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind ViewHolder ( holder , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate ViewHolder ( holder , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView Binding Holder < ViewData Binding >, Ġposition : ĠInt , Ġpayload s : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isValid Pay Load s ( payload s )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind ViewHolder ( holder , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Bind ViewHolder ( holder , Ġposition , Ġpayload s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ViewHolder ( holder : ĠRecyclerView Binding Holder < ViewData Binding >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠ Ġval Ġitem Type Ġ= Ġitem Types [ item :: class ] ĊĠĠĠĠĠĠĠ Ġif Ġ( item Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . set Variable ( item Type . variable Id , Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisValid Pay Load s ( payload s : ĠList < Any >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( payload s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpayload s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= ĠDATA _ INVALID ATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ å»ºç«ĭ æķ°æį® ç±» ä¸İ å¸ĥå±Ģ æĸĩä»¶ ä¹ĭéĹ´çļĦ åĮ¹éħį åħ³ç³» Ċ Ġ* Ġ@ param Ġvariable Id ĠBR . xx Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠAny , ĠAdapter Ġ: ĠRecyclerView Binding Adapter < T >> ĠAdapter . match ( k Class : ĠK Class <* >, Ġitem Layout Id : ĠInt , Ġvariable Id : ĠInt ): ĠAdapter Ġ{ ĊĠĠĠ Ġitem Types . put ( k Class , ĠItem Type ( item Layout Id , Ġvariable Id )) ĊĠĠĠ Ġreturn Ġthis Ċ }