package Ġcom . ar aco ix . register Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Keep Ċ import Ġandroidx . lifecycle .* Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . view binding . View Binding Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . actor Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ@ date : Ġ 2 0 2 1 / 4 / 9 Ċ Ġ* Ġ@ author : ĠAr aco ix Ċ Ġ* Ġ@ Description : Ġ å¤ļ ç±»åŀĭ æ³¨åĨĮ åŁºç¡Ģ ViewHolder Ċ Ġ* Ġ@ version : Ġv 2 . 0 Ġ æĸ°å¢ŀ äºĨ çĶŁåĳ½ åĳ¨æľŁ Ġ ĠLifecycle Owner Ġ, Coroutine Scope , ViewModel Store Owner Ċ Ġ*/ Ċ @ Keep Ċ abstract Ġclass ĠBase Register ViewHolder < T Ġ: ĠAny , ĠVB Ġ: ĠView Binding >( override Ġval Ġm Binding : ĠVB ) Ġ: ĊĠĠĠ ĠRecyclerView . ViewHolder ( m Binding . root ), ĊĠĠĠ ĠView Binding Layout Container < VB >, ĊĠĠĠ ĠLifecycle Owner , ĊĠĠĠ ĠCor outine Scope , ĊĠĠĠ ĠViewModel Store Owner Ġ{ ĊĊĠĠĠ Ġvar Ġclick Listener : ĠRegister ClickListener ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåıĤæķ° map ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġvalues : ĠMap < String , ĠAny > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł touch Ġ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġfun Ġadd On Touch Listener ( view Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclick Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < View >( view Id ). setOn Touch Listener Ġ{ Ġv , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Touch ( v , Ġevent , Ġlayout Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł touch Ġ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġfun Ġadd On Touch Listener ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclick Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOn Touch Listener Ġ{ Ġv , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Touch ( v , Ġevent , Ġlayout Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł çĤ¹åĩ» äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd OnClickListener ( view Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠitemView . findViewById < View >( view Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOnClickListener Ġ{ Ġclick Listener ?. onClick ( it , Ġlayout Position ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł çĤ¹åĩ» äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd OnClickListener ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . setOnClickListener Ġ{ Ġclick Listener ?. onClick ( it , Ġlayout Position ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł çĤ¹åĩ» äºĭä»¶ Ġ éĺ² æŃ¢ éĩįå¤į çĤ¹åĩ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Multi ClickListener ( view Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠitemView . findViewById < View >( view Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. multi ClickListener Ġ{ Ġclick Listener ?. onClick ( it , Ġlayout Position ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł çĤ¹åĩ» äºĭä»¶ Ġ éĺ² æŃ¢ éĩįå¤į çĤ¹åĩ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Multi ClickListener ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . multi ClickListener Ġ{ Ġclick Listener ?. onClick ( it , Ġlayout Position ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç©º çĤ¹åĩ» äºĭä»¶ Ġ éĺ² æŃ¢ éĩįå¤į çĤ¹åĩ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Multi ClickListener ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . multi ClickListener Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł éķ¿ æĮī äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd On Long ClickListener ( view Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclick Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . findViewById < View >( view Id ). setOn Long ClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Long Click ( v , Ġlayout Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ·»åĬł éķ¿ æĮī äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd On Long ClickListener ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclick Listener ?. let Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOn Long ClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Long Click ( v , Ġlayout Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç»ĳå®ļ äºĭä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġbind Data ( data : ĠT , Ġpayload s : ĠList < Any > Ġ= Ġarray ListOf ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ æİ¥ è§¦ ç»ĳå®ļ äºĭä»¶ å¹¶ éĩĬæĶ¾ èµĦæºĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġun Bind Data () Ġ{} ĊĊĠĠĠ Ġfun Ġon Clear () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠ Ġstore . clear () ĊĠĠĠĠĠĠĠ Ġlife Cycle Register Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġvar Ġlife Cycle Register : ĠLifecycle Registry ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġfun Ġreset Life Cycle ( clear : ĠBoolean ): ĠLifecycle Registry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( clear ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Cycle Register ?. handle Lifecycle Event ( Lifecycle . Event . ON _ PAUSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Cycle Register ?. handle Lifecycle Event ( Lifecycle . Event . ON _ STOP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Cycle Register ?. handle Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Cycle Register Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . clear () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= ĠJob () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore Ġ= ĠViewModel Store () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlife Cycle Register Ġ= ĠLifecycle Registry ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlife Cycle Register !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Lifecycle (): ĠLifecycle Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( life Cycle Register Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlife Cycle Register Ġ= ĠLifecycle Registry ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlife Cycle Register !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġvar Ġjob : ĠJob Ġ= ĠJob () ĊĠĠĠ Ġprotected Ġvar Ġstore Ġ= ĠViewModel Store () ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġjob Ġ+ ĠDispatch ers . Main ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĤ¹åĩ» äºĭä»¶ éĺ» æŃ¢ éĩįå¤į çĤ¹åĩ» Ġ åı¯èĥ½ é«ĺ çīĪ éĿ¢ æ²¡ è¿Ļä¸ª Ġactor Ġæĸ¹æ³ķ äºĨ Q âĢ¦âĢ¦ Q ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠView . multi ClickListener ( time : ĠLong Ġ= Ġ 8 0 0 , Ġaction : Ġsuspend Ġ( View ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Actor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . actor < View >( context Ġ= ĠDispatch ers . Main , Ġcapacity Ġ= ĠChannel . REN DE Z VO US ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġchannel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Actor . offer ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ViewModel Store () Ġ= Ġstore Ċ } Ċ Ċ /** Ċ Ġ* holder Ġadd Ġto Ġview Group Ċ Ġ*/ Ċ inline Ġfun Ġ< T Ġ: ĠAny , Ġre ified ĠVB Ġ: ĠView Binding > ĊĠĠĠĠĠĠĠ ĠK Class < out ĠBase Register ViewHolder < T , Ġout ĠVB >> . holder 2 View ( ĊĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠ Ġdata : ĠT , Ġmap : ĠHashMap < String , ĠAny > Ġ= Ġhash Map Of (), ĊĠĠĠ Ġclick Listener : ĠRegister ClickListener ? Ġ= Ġnull Ċ ): ĠBase Register ViewHolder < T , ĠVB > Ġ= ĊĠĠĠ Ġthis . java . holder 2 View ( parent , Ġdata , Ġmap , Ġclick Listener ) ĊĊ Ċ inline Ġfun Ġ< T Ġ: ĠAny , Ġre ified ĠVB Ġ: ĠView Binding > ĊĠĠĠĠĠĠĠ ĠClass < out ĠBase Register ViewHolder < T , Ġout ĠVB >> . holder 2 View ( ĊĠĠĠ Ġparent : ĠViewGroup , ĊĠĠĠ Ġdata : ĠT , ĊĠĠĠ Ġmap : ĠHashMap < String , ĠAny > Ġ= Ġhash Map Of (), ĊĠĠĠ Ġclick Listener : ĠRegister ClickListener ? Ġ= Ġnull Ċ ): ĠBase Register ViewHolder < T , ĠVB > Ġ{ ĊĠĠĠ Ġval Ġbinding Ġ= ĠVB :: class . java ĊĠĠĠ Ġval Ġcon Ġ= Ġthis . get Constructor ( binding ) ĊĠĠĠ Ġval Ġinf late Ġ= Ġbinding . getDeclared Method ( ĊĠĠĠĠĠĠĠ Ġ" inflate ", ĊĠĠĠĠĠĠĠ ĠLayoutInflater :: class . java , ĊĠĠĠĠĠĠĠ ĠViewGroup :: class . java , ĊĠĠĠĠĠĠĠ ĠBoolean :: class . java ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġview Binding Ġ= ĊĠĠĠĠĠĠĠ Ġinf late . invoke ( null , ĠLayoutInflater . from ( parent . context ), Ġparent , Ġtrue ) Ġas ĠView Binding ĊĠĠĠ Ġval Ġbase Register ViewHolder Ġ= Ġcon . newInstance ( view Binding ) Ġas ĠBase Register ViewHolder < T , ĠVB > ĊĠĠĠ Ġbase Register ViewHolder . values Ġ= Ġmap ĊĠĠĠ Ġbase Register ViewHolder . click Listener Ġ= Ġclick Listener ĊĠĠĠ Ġbase Register ViewHolder . bind Data ( data , Ġarray ListOf ()) ĊĠĠĠ Ġval Ġlifecycle Owner Ġ= ĊĠĠĠĠĠĠĠ Ġparent . find View Tree Lifecycle Owner () Ġ?: Ġif Ġ( parent . context Ġis ĠLifecycle Owner ) Ġparent . context Ġas ĠLifecycle Owner Ġelse Ġnull ĊĠĠĠ Ġlifecycle Owner ?. lifecycle ?. observer Event ( Lifecycle . Event . ON _ DESTROY ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlifecycle Ġ= Ġbase Register ViewHolder . lifecycle ĊĠĠĠĠĠĠĠ Ġif Ġ( lifecycle Ġis ĠLifecycle Registry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle . handle Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbase Register ViewHolder . on Clear () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbase Register ViewHolder Ċ } Ċ Ċ fun ĠLifecycle . observer Event ( var arg Ġevents : ĠLifecycle . Event , Ġfunc : Ġ( Lifecycle . Event ) Ġ-> ĠUnit ): ĠLifecycle Event Observer Ġ{ ĊĠĠĠ Ġreturn ĠLifecycle Event Observer Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . invoke ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Observer ( this ) ĊĠĠĠ Ġ} Ċ }