package Ġcom . fro go box . recycler . core Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . fro go box . fro go log . F Log Ċ import Ġcom . fro go box . recycler . R Ċ import Ġcom . fro go box . recycler . core . F ro go Rv Constant . F RO GO _ RV _ TAG Ċ Ċ /* Ċ Ġ* ĠCreated Ġby ĠF ais al ĠA mir Ċ Ġ* Ġ================================= ======== Ċ Ġ* ĠF ro go RecyclerView Adapter Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 9 / 0 4 / 2 0 2 0 . ĠĠĠĠĠĠ Ċ Ġ* ĠAll Ġrights Ġreserved Ċ Ġ* Ġ-------------------------------- --------- Ċ Ġ* ĠName ĠĠĠĠ Ġ: ĠMu ham mad ĠF ais al ĠA mir Ċ Ġ* ĠE - mail ĠĠ Ġ: Ġfa is alam ir cs @ gmail . com Ċ Ġ* ĠGithub ĠĠ Ġ: Ġgithub . com / am iris back Ċ Ġ* Ġ-------------------------------- --------- Ċ Ġ* ĠF ro go Box ĠInc Ċ Ġ* Ġcom . fro go box . recycler . base Ċ Ġ* ĠĊ Ġ*/ Ċ abstract Ġclass ĠF ro go RecyclerView Adapter < T > Ġ: ĊĠĠĠ ĠRecyclerView . Adapter < F ro go RecyclerView Holder < T >>() Ġ{ ĊĊĠĠĠ Ġvar Ġhas Empty View Ġ= Ġfalse ĊĠĠĠ Ġvar Ġhas Multi Holder Ġ= Ġfalse ĊĠĠĠ Ġvar Ġhas Nested View Ġ= Ġfalse ĊĊĠĠĠ Ġprotected Ġvar Ġview Listener : ĠF ro go RecyclerView Listener < T >? Ġ= Ġnull ĊĊĠĠĠ Ġprotected Ġval Ġlist Position Ġ= ĠHashMap < Int , ĠInt >() ĊĠĠĠ Ġprotected Ġval Ġshared Pool Ġ= ĠRecyclerView . Re cyc led View Pool () ĊĊĠĠĠ Ġprotected Ġval Ġf ro go Holder Ġ= Ġmutable ListOf < F ro go Holder < T >>() ĊĠĠĠ Ġprotected Ġval Ġlist Data Ġ= Ġmutable ListOf < T >() ĊĠĠĠ Ġprotected Ġval Ġlist Data Nested Ġ= Ġmutable ListOf < Mutable List < T >>() ĊĠĠĠ Ġprotected Ġvar Ġlist Count Ġ= Ġ 0 ĊĊĠĠĠ Ġprotected Ġvar Ġlayout Rv : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprotected Ġvar Ġcustom Layout Rest Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprotected Ġvar Ġempty Layout Res Id : ĠInt Ġ= ĠR . layout . fro go _ container _ empty _ view ĊĊĠĠĠ Ġfun Ġbind Nested Holder () Ġ{ ĊĊĠĠĠ Ġ} Ġ// Ġcomponent Ġview ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Nested View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Data Nested . size ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Multi Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Empty View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Count Ġ= Ġif Ġ( fro go Holder . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ro go Holder . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ro go Holder . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Empty View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Count Ġ= Ġif Ġ( list Data . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Data . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Data . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠF ro go RecyclerView Holder < T >, Ġposition : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠF Log . d ("$ F RO GO _ RV _ TAG Ġ- Ġhas Multi Holder Ġ: Ġ$ has Multi Holder ") ĊĠĠĠĠĠĠĠ ĠF Log . d ("$ F RO GO _ RV _ TAG Ġ- Ġhas Empty View Ġ: Ġ$ has Empty View ") ĊĠĠĠĠĠĠĠ ĠF Log . d ("$ F RO GO _ RV _ TAG Ġ- Ġlist Count Ġ: Ġ$ list Count ") ĊĠĠĠĠĠĠĠ ĠF Log . d ("$ F RO GO _ RV _ TAG Ġ- Ġf ro go Holder Ġ: Ġ${ fro go Holder . size }") ĊĠĠĠĠĠĠĠ ĠF Log . d ("$ F RO GO _ RV _ TAG Ġ- Ġlist Data Ġ: Ġ${ list Data . size }") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Nested View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Nested Holder () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Multi Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Empty View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fro go Holder . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind Item ( fro go Holder [ position ]. data , Ġf ro go Holder [ position ]. listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind Item ( fro go Holder [ position ]. data , Ġf ro go Holder [ position ]. listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Empty View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Data . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind Item ( list Data [ position ], Ġview Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind Item ( list Data [ position ], Ġview Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Multi Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fro go Holder . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ro go Holder [ position ]. option ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . getItem ViewType ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . getItem ViewType ( position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Re cyc led ( holder : ĠF ro go RecyclerView Holder < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Nested View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġholder . adapter Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnested Holder Ġ= Ġholder Ġas ĠF ro go Nested Holder < T > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Position [ position ] Ġ= Ġnested Holder . get Linear LayoutManager (). findFirst Visible Item Position () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on View Re cyc led ( holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlayout Handling () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Multi Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Layout Rest Id Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Rv Ġ= Ġif Ġ( fro go Holder . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Layout Rest Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Layout Res Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( custom Layout Rest Id Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Rv Ġ= Ġif Ġ( list Data . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Layout Rest Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Layout Res Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġview Layout ( parent : ĠViewGroup ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLayoutInflater . from ( parent . context ). inflate ( layout Rv , Ġparent , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġview Layout ( parent : ĠViewGroup , Ġlayout Res Id : ĠInt ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Layout Rest Id Ġ= Ġlayout Res Id ĊĠĠĠĠĠĠĠ Ġlayout Handling () ĊĠĠĠĠĠĠĠ Ġreturn ĠLayoutInflater . from ( parent . context ). inflate ( layout Rv , Ġparent , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Nested View () Ġ{ ĊĠĠĠĠĠĠĠ Ġhas Nested View Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Multi Holder () Ġ{ ĊĠĠĠĠĠĠĠ Ġhas Multi Holder Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Empty View ( empty View : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġhas Empty View Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( empty View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Layout Res Id Ġ= Ġempty View ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlayout Handling () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Data Nested ( data : ĠList < Mutable List < T >> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list Data Nested . clear () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . list Data Nested . addAll ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Data ( data : ĠList < T > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . list Data . clear () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . list Data . addAll ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Listener ( listener : ĠF ro go RecyclerView Listener < T > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Custom Layout ( custom View Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Layout Rest Id Ġ= Ġcustom View Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Requirement ( ĊĠĠĠĠĠĠĠ Ġcustom View Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġdata : ĠList < T > ?, ĊĠĠĠĠĠĠĠ Ġlistener : ĠF ro go RecyclerView Listener < T >? ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . list Data . clear () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . list Data . addAll ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcustom Layout Rest Id Ġ= Ġcustom View Id ĊĠĠĠĠĠĠĠ Ġlayout Handling () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Requirement ( view Holder : ĠList < F ro go Holder < T >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġf ro go Holder . addAll ( view Holder ) ĊĠĠĠ Ġ} Ċ Ċ }