package Ġcom . ken ilt . skeleton . managers . recycler Ċ Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . ba oy z . widget . Pull Refresh Layout Ċ import Ġcom . ken ilt . skeleton . extension . value Ċ import Ġcom . ken ilt . skeleton . managers . interfaces . I Model Ċ import Ġcom . ken ilt . skeleton . managers . listeners . End less Recycler On Scroll Listener Ċ import Ġcom . ken ilt . skeleton . ui . base . adapter . Base Recycler Adapter Ċ import Ġcom . ken ilt . skeleton . ui . custom . Footer Loading View Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġth ang ng uy en Ġon Ġ 3 / 7 / 1 9 . Ċ Ġ*/ Ċ abstract Ġclass ĠRe cycler Helper < T Ġ: ĠI Model >( ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġpr l Refresh Layout : ĠPull Refresh Layout , ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġrv RecyclerView : ĠRecyclerView ): ĠI Recycler Helper < T > Ġ{ ĊĊĠĠĠ Ġvar Ġre cycler Presenter : ĠRe cycler Presenter < T >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. recycler Helper Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġfooter View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġadapter : ĠBase Recycler Adapter < T >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġend less Recycler On Scroll Listener : ĠEnd less Recycler On Scroll Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Refresh Layout () ĊĠĠĠĠĠĠĠ Ġinit RecyclerView () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġinit Refresh Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġpr l Refresh Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Refresh Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġinit RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġlayout Ġmanager ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġcreate LayoutManager () ĊĠĠĠĠĠĠĠ Ġcheck LayoutManager ( layout Manager ) ĊĠĠĠĠĠĠĠ Ġrv RecyclerView . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġ// Ġadapter ĊĠĠĠĠĠĠĠ Ġif Ġ( adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcreate Adapter () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrv RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġ// Ġfooter ĊĠĠĠĠĠĠĠ Ġfooter View Ġ= Ġcreate Footer View () ĊĠĠĠĠĠĠĠ Ġfooter View ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. set Footer View ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( end less Recycler On Scroll Listener Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend less Recycler On Scroll Listener Ġ= Ġcreate End less Recycler Scroll Listener () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġload Cache Data () ĊĠĠĠĠĠĠĠ Ġend less Recycler On Scroll Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv RecyclerView . add On Scroll Listener ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Footer State () ĊĊĠĠĠĠĠĠĠ Ġset Animator For RecyclerView () ĊĠĠĠĠĠĠĠ Ġcustom RecyclerView SetUp () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġset Animator For RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdisable Ġitem Ġanim ator ĊĠĠĠĠĠĠĠ Ġrv RecyclerView . item Animator Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcustom RecyclerView SetUp () Ġ{} ĊĊĠĠĠ Ġopen Ġfun Ġcreate LayoutManager (): ĠRecyclerView . LayoutManager Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLinearLayoutManager ( rv RecyclerView . context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcheck LayoutManager ( layout Manager : ĠRecyclerView . LayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(!( layout Manager Ġis ĠLinearLayoutManager Ġ|| Ġlayout Manager Ġis ĠGrid LayoutManager )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Layout Ġmanager Ġmust Ġbe Ġinstance Ġof ĠLinearLayoutManager Ġor ĠGrid LayoutManager ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcreate Footer View (): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfooter Loading View Ġ= ĠFooter Loading View ( rv RecyclerView . context ) ĊĠĠĠĠĠĠĠ Ġval Ġno Item Text Ġ= Ġget No Item Text () ĊĠĠĠĠĠĠĠ Ġif Ġ( no Item Text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Loading View . set No Item Text ( no Item Text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfooter Loading View ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġget No Item Text (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġcreate Adapter (): ĠBase Recycler Adapter < T >? ĊĊĠĠĠ Ġopen Ġfun Ġcreate End less Recycler Scroll Listener (): ĠEnd less Recycler On Scroll Listener ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġrv RecyclerView . layout Manager Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠEnd less Recycler On Scroll Listener ( layout Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad More ( page : ĠInt , Ġtotal ItemCount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonLoad More Data ( page , Ġtotal ItemCount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġload Cache Data () Ġ{ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Refresh Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġend less Recycler On Scroll Listener ?. reset () ĊĠĠĠĠĠĠĠ Ġre cycler Presenter ?. on Refresh Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠonLoad More Data ( page : ĠInt , Ġtotal Items Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġre cycler Presenter ?. call Api Data WithType ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset DataList For Adapter ( data Model List : ĠMutable List < T >, Ġis Refresh : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. data List Ġ= Ġdata Model List ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. append DataList ( data Model List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Refresh ing ( is Refresh ing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpr l Refresh Layout . set Refresh ing ( is Refresh ing ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Ended ( is Ended : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġend less Recycler On Scroll Listener ?. is Ended Ġ= Ġis Ended ĊĠĠĠĠĠĠĠ Ġupdate Footer State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġupdate Footer State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfooter View Ġ= Ġfooter View Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( end less Recycler On Scroll Listener ?. is Ended Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adapter Ġ!= Ġnull Ġ&& Ġadapter ?. isEmpty Content () Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. clear Foot ers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. set Footer View ( footer View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( footer View Ġis ĠFooter Loading View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter View . setState ( Footer Loading View . Footer State . NO _ ITEM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. set Footer View ( footer View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( footer View Ġis ĠFooter Loading View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter View . set Show Content ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfooter View . setState ( Footer Loading View . Footer State . LOADING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cycler Presenter ?. stop All Request () ĊĠĠĠĠĠĠĠ Ġre cycler Presenter ?. page Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġend less Recycler On Scroll Listener ?. reset () ĊĠĠĠĠĠĠĠ Ġadapter ?. clear DataList () ĊĠĠĠĠĠĠĠ Ġrv RecyclerView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end less Recycler On Scroll Listener ?. is Scroll F ired Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Refresh Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Footer State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsmooth Scroll To Top () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanchor Position Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( end less Recycler On Scroll Listener ?. getFirst Visible Position (). value Ġ> Ġanchor Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv RecyclerView . scrollTo Position ( anchor Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrv RecyclerView . smooth Scroll To Position ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġsmooth Scroll To Top And Action ( after Animation : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( end less Recycler On Scroll Listener ?. getFirst Visible Position () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Animation . run () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv RecyclerView . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end less Recycler On Scroll Listener ?. getFirst Visible Position () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv RecyclerView . remove On Scroll Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Animation . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsmooth Scroll To Top () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprevent Just Recent Action Effect Load () Ġ{ ĊĠĠĠĠĠĠĠ Ġend less Recycler On Scroll Listener ?. previous Total Ġ= Ġadapter ?. item Count . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Item At Position ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter ?. removeItem ( position ) ĊĠĠĠĠĠĠĠ Ġupdate Footer State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Item ( item : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter ?. removeItem ( item ) ĊĠĠĠĠĠĠĠ Ġupdate Footer State () ĊĠĠĠ Ġ} Ċ } Ċ