package Ġcom . ar aco ix . register Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . collection . Sparse Array Compat Ċ import Ġandroidx . view binding . View Binding Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* Ġèİ·åıĸ Data Binding Ċ Ġ*/ Ċ internal Ġinterface ĠView Binding Layout Container < T Ġ: ĠView Binding > Ġ{ ĊĠĠĠ Ġpublic Ġval Ġm Binding : ĠT ? Ċ } Ċ Ċ /** Ċ Ġ* Ġholder Ġæķ°æį® å¤ĦçĲĨ Ċ Ġ*/ Ċ internal Ġinterface ĠI Register Action Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ view Type ĠéĢļè¿ĩ ç±»åŀĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Binding HashCode By ViewType ( position : ĠInt , Ġany : ĠAny ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ View Binding ĠçļĦ ĠhashCode Ġèİ·åıĸ ĠviewHolder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget ViewHolder By Binding HashCode ( type : ĠInt ): ĠClass < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® click Ġ ä¸İ view Holder Ġ ç»ĳå®ļ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbind Click With ViewHolder ( holder : ĠBase Register ViewHolder < *, Ġout ĠView Binding >): ĠRegister ClickListener ? Ċ Ċ } Ċ Ċ /** Ċ Ġ* Ġ åıį å°Ħ å¤±è´¥ Ċ Ġ*/ Ċ internal Ġclass ĠH older Init Exception ( view Holder Name : ĠString , Ġcause : ĠThrowable ? Ġ= Ġnull ) Ġ: ĠRuntimeException ("$ view Holder Name Ġ åıį å°Ħ åĪĿå§ĭåĮĸ å¤±è´¥ ", Ġcause ) Ċ Ċ /** Ċ Ġ* Ġ æľª æ³¨åĨĮ view holder ĠæĹ¶ è§¦åıĳ Ċ Ġ*/ Ċ internal Ġclass ĠNot Register Exception ( className : ĠString , Ġcause : ĠThrowable ? Ġ= Ġnull ) Ġ: ĠRuntimeException ("$ className Ġ ç±»åŀĭ æľª æ³¨åĨĮ ", Ġcause ) Ċ Ċ /** Ċ Ġ* Ġ æ³¨åĨĮ æķ°æį® ç®¡çĲĨ Ċ Ġ*/ Ċ internal Ġclass ĠRegister Manager Ġ: ĠI Register , ĠI Register Action Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġholder Id Map Ġ= ĠConcurrent HashMap < String , ĠInt >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ åŃĺ æĶ¾ ĠView Binding ĠçļĦ Ġholder id ĠåĴĮ Ġview holder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar ĠviewHolder Map Ġ= ĠSparse Array Compat < Class < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >> >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ åŃĺ æĶ¾ ĠBean ĠçļĦ Ġholder id ĠåĴĮ Ġbean ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmodel TypeMap Ġ= ĠSparse Array Compat < Class <* >>() ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ åŃĺ æĶ¾ ĠView Binding ĠçļĦ ĠhashCode ĠåĴĮ Ġclick ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġclick Listener Map Ġ= ĠSparse Array Compat < Register ClickListener ?> () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ åŃĺ æĶ¾ åĪĿå§ĭåĮĸ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġinit Map Ġ= ĠSparse Array Compat < Map < String , ĠAny >>() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠçĶ¨æĪ· åŃĺ æĶ¾ bean Ġview holder Ġä¸Ģ å¯¹ å¤ļ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmulti Model Map Ġ= Ġmutable Map Of < Class <* >, ĠMulti Register < Any >>() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠçĶ¨æĪ· åŃĺ æĶ¾ View Binding ĠçļĦ Ġholder id Ġview holder Ġä¸Ģ å¯¹ å¤ļ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġmulti ViewHolder Map Ġ= ĠSparse Array Compat < Class < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >> >() ĊĊĠĠĠ Ġval Ġincre as or : ĠAtomicInteger Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠ Ġfun Ġgen Holder Id ( view Holder : ĠClass < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >> ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġholder Info Str Ġ= Ġeval Holder Id Key ( view Holder ) ĊĠĠĠĠĠĠĠ Ġvar Ġholder Id Ġ= Ġholder Id Map [ holder Info Str ] ĊĠĠĠĠĠĠĠ Ġif Ġ( holder Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġincre as or . get And Increment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Id Map [ holder Info Str ] Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġholder Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġeval Holder Id Key ( view Holder : ĠClass < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġholder Info Str Ġ= Ġreflect Data Binding ( view Holder ). toString () Ġ+ Ġ"-" Ġ+ Ġreflect Class ( view Holder ). toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġholder Info Str ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæķ°æį® åŃĺåĤ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġregister ( register Item : ĠRegister Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġreflect Class ( register Item . view Holder ) ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æľī å°± åĪłéĻ¤ ĊĠĠĠĠĠĠĠ Ġif Ġ( model TypeMap . indexOf Value ( model ) Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġmodel TypeMap . indexOf Value ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder Id Map . remove ( eval Holder Id Key ( register Item . view Holder )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Map . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel TypeMap . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener Map . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Map . remove At ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġholder Id : ĠInt Ġ= Ġgen Holder Id ( register Item . view Holder )// Ġreflect Data Binding ( register Item . view Holder ). hashCode () Ġ+ Ġmodel . hashCode () ĊĠĠĠĠĠĠĠ ĠviewHolder Map . put ( holder Id , Ġregister Item . view Holder ) ĊĠĠĠĠĠĠĠ Ġmodel TypeMap . put ( holder Id , Ġmodel ) ĊĠĠĠĠĠĠĠ Ġclick Listener Map . put ( holder Id , Ġregister Item . register ClickListener ) ĊĠĠĠĠĠĠĠ Ġinit Map . put ( holder Id , Ġregister Item . init Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠClass < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >>, ĊĠĠĠĠĠĠĠ Ġclick Listener : ĠRegister ClickListener ?, ĊĠĠĠĠĠĠĠ Ġinit : ĠMap < String , ĠAny >? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( Register Item ( clazz , Ġclick Listener , Ġinit )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æ³¨åĨĮ åĲĮ bean ä¸įåĲĮ item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġmulti Register ( register : ĠMulti Register <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmulti Model Map [ reflect Class ( register :: class . java )] Ġ= Ġregister Ġas ĠMulti Register < Any > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ ç±»åŀĭ èİ·åıĸ View Binding ĠçļĦ ĠhashCode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Binding HashCode By ViewType ( position : ĠInt , Ġany : ĠAny ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġany . java Class ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġmodel TypeMap . indexOf Value ( clazz ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmulti Clazz Ġ= Ġmulti Model Map . containsKey ( clazz ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( multi Clazz ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmulti Link Ġ= Ġmulti Model Map [ clazz ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti Link ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Ġ= Ġit . pick Item ( position , Ġany ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġholder Id Ġ= Ġholder Id Map [ eval Holder Id Key ( link . view Holder )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġgen Holder Id ( link . view Holder )// Ġreflect Data Binding ( link . view Holder ). hashCode () Ġ+ Ġclazz . hashCode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( multi ViewHolder Map . get ( holder Id ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti ViewHolder Map . put ( holder Id , Ġlink . view Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener Map . put ( holder Id , Ġlink . register ClickListener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Map . put ( holder Id , Ġlink . init Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġholder Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" ç±»åŀĭ æľª æ³¨åĨĮ ", Ġmodel TypeMap . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot Register Exception ( clazz . simple Name Ġas ĠString ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmodel TypeMap . key At ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ View Binding ĠçļĦ ĠhashCode Ġèİ·åıĸ view holder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget ViewHolder By Binding HashCode ( type : ĠInt ): ĠClass < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ ĠNullPointerException (" no Ġsuch Ġtype !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠviewHolder Ġ= ĠviewHolder Map [ type ] ĊĠĠĠĠĠĠĠ Ġval Ġmulti ViewHolder Ġ= Ġmulti ViewHolder Map [ type ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠviewHolder ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( multi ViewHolder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmulti ViewHolder ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow Ġ ĠNullPointerException (" no Ġsuch Ġtype !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind Click With ViewHolder ( holder : ĠBase Register ViewHolder < *, Ġout ĠView Binding >): ĠRegister ClickListener ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġholder . java Class ĊĊĠĠĠĠĠĠĠ Ġval Ġview Index Ġ= ĠviewHolder Map . indexOf Value ( clazz ) ĊĠĠĠĠĠĠĠ Ġval Ġmulti Index Ġ= Ġmulti ViewHolder Map . indexOf Value ( clazz ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Layout Ġ= ĠviewHolder Map . key At ( view Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclick Listener Map [ view Layout ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( multi Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmulti Layout Ġ= Ġmulti ViewHolder Map . key At ( multi Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclick Listener Map [ multi Layout ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Init With Holder ( type : ĠInt ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Map Ġ= Ġinit Map [ type ] Ġ?: Ġreturn Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġif Ġ( value Map . isEmpty ()) Ġreturn Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue Map ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* Ġ æ³¨åĨĮ çĽ¸åħ³ Ċ Ġ*/ Ċ internal Ġinterface ĠI Register Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æ³¨åĨĮ item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister ( register Item : ĠRegister Item ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æ³¨åĨĮ item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠClass < out ĠBase Register ViewHolder < *, Ġout ĠView Binding >>, ĊĠĠĠĠĠĠĠ Ġclick Listener : ĠRegister ClickListener ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġinit : ĠMap < String , ĠAny >? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æ³¨åĨĮ ä¸įåĲĮçļĦ item Ġ ä¾Ŀèµĸ äºİ åĲĮ ä¸Ģä¸ª Bean ç±»åŀĭçļĦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmulti Register ( register : ĠMulti Register <* >) Ċ Ċ } Ċ Ċ internal Ġval Ġparameter Type Cache Ġ= ĠHashMap < Class <* >, ĠArray < Class < Any >> >() Ċ Ċ internal Ġfun Ġget Parameterized Type ( clazz : ĠClass < *> ): ĠArray < Class < Any >> Ġ{ ĊĠĠĠ Ġvar Ġarr Ġ= Ġparameter Type Cache [ clazz ] ĊĠĠĠ Ġif Ġ( arr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgeneric Super class Ġ= Ġclazz . generic Super class ĊĠĠĠĠĠĠĠ Ġvar Ġthe Clazz : ĠClass < *> ? Ġ= Ġclazz ĊĠĠĠĠĠĠĠ Ġwhile Ġ( generic Super class Ġ! is ĠParameter ized Type Ġ&& Ġthe Clazz Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthe Clazz Ġ= Ġthe Clazz . super class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeneric Super class Ġ= Ġthe Clazz ?. generic Super class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( generic Super class Ġ! is ĠParameter ized Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" no ĠParameter ized Type Ġin ĠViewHolder ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġgeneric Super class ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġtype . actual Type Arguments ĊĠĠĠĠĠĠĠ Ġarr Ġ= Ġp . map Ġ{ Ġit Ġas ĠClass < Any > Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġif Ġ( arr . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type Cache [ clazz ] Ġ= Ġarr ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġarr Ċ } Ċ Ċ internal Ġfun Ġreflect Class ( clazz : ĠClass < *> ): ĠClass < Any > Ġ= Ġget Parameterized Type ( clazz )[ 0 ] Ċ Ċ internal Ġfun Ġreflect Data Binding ( clazz : ĠClass < *> ): ĠClass < Any > Ġ= Ġget Parameterized Type ( clazz )[ 1 ]