package Ġcom . xin think . widgets Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġthat Ġimplements Ġ[ RecyclerView . On Scroll Listener ], Ġprovides Ġcallback Ġfor Ġend less Ġlist . Ċ Ġ* Ċ Ġ* Ġ@ param Ġwill Reach Bottom Ġcallback Ġwhen Ġthe Ġbottom Ġis Ġappro aching Ġ( inv oked Ġmultiple Ġtimes ) Ċ Ġ*/ Ċ abstract Ġclass ĠRecyclerView On Scroll Listener ( ĊĠĠĠ Ġprivate Ġval Ġwill Reach Bottom : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġprev First Visible Position Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** Ġnumber Ġof Ġcolumns Ġon Ġa Ġrow Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġval Ġspan Count : ĠInt Ġ= Ġ 1 ĊĊĠĠĠ Ġ/** Ġretrieve Ġposition Ġof Ġthe Ġfirst Ġvisible Ġitem Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġfind First Visible Item Position (): ĠInt ĊĊĠĠĠ Ġ/** Ġretrieve Ġposition Ġof Ġthe Ġlast Ġitem Ġwhich Ġis Ġfully Ġvisible Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġfind Last Comp let ely Visible Item Position (): ĠInt ĊĊĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Count Ġ= Ġre cyclerView . adapter ?. item Count Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ<= Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Item Index Ġ= Ġitem Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġlast Visible Index Ġ= Ġfind Last Comp let ely Visible Item Position () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Visible Position Ġ= Ġfind First Visible Item Position () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( last Item Index Ġ> Ġ 0 Ġ&& Ġlast Item Index Ġ- Ġlast Visible Index Ġ<= ĠDIST ANCE _ RE ACH ING _ BOTTOM Ġ* Ġspan Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" appro aching Ġbottom : Ġlast =$ last Item Index Ġlast Visible =$ last Visible Index ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwill Reach Bottom ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprev First Visible Position Ġ= Ġfirst Visible Position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" RV Scroll " ĊĊĠĠĠĠĠĠĠ Ġ/** ĠDistance Ġ( rows ) Ġappro aching Ġthe Ġbottom Ġtriggers Ġ' re aching Ġbottom ' Ġevents Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDIST ANCE _ RE ACH ING _ BOTTOM Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Linear LayoutManager ] Ġbased Ġimplementation Ġof Ġ[ RecyclerView On Scroll Listener ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġlayout Manager Ġ[ Linear LayoutManager ] Ċ Ġ* Ġ@ param Ġwill Reach Bottom Ġsee Ġ[ RecyclerView On Scroll Listener ] Ċ Ġ* Ġ@ param Ġcallback Ġsee Ġ[ RecyclerView On Scroll Listener ] Ċ Ġ*/ Ċ class ĠLinear Recycler On Scroll Listener ( ĊĠĠĠ Ġprivate Ġval Ġlayout Manager : ĠLinearLayoutManager , ĊĠĠĠ Ġwill Reach Bottom : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠRecyclerView On Scroll Listener ( will Reach Bottom ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġspan Count Ġ= Ġ( layout Manager Ġas ? ĠGrid LayoutManager )?. span Count Ġ?: Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun Ġfind First Visible Item Position () Ġ= Ġlayout Manager . findFirst Visible Item Position () ĊĊĠĠĠ Ġoverride Ġfun Ġfind Last Comp let ely Visible Item Position () Ġ= Ġlayout Manager . find Last Visible Item Position () Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ St agger ed Grid LayoutManager ] Ġbased Ġimplementation Ġof Ġ[ RecyclerView On Scroll Listener ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġlayout Manager Ġ[ St agger ed Grid LayoutManager ] Ċ Ġ* Ġ@ param Ġwill Reach Bottom Ġsee Ġ[ RecyclerView On Scroll Listener ] Ċ Ġ*/ Ċ class ĠSt agger ed Recycler On Scroll Listener ( ĊĠĠĠ Ġprivate Ġval Ġlayout Manager : ĠSt agger ed Grid LayoutManager , ĊĠĠĠ Ġwill Reach Bottom : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠRecyclerView On Scroll Listener ( will Reach Bottom ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġspan Count Ġ= Ġlayout Manager . span Count ĊĊĠĠĠ Ġoverride Ġfun Ġfind First Visible Item Position () Ġ= ĠInt Array ( span Count ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Manager . findFirst Visible Item Positions ( this ) ĊĠĠĠĠĠĠĠ Ġfirst () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Last Comp let ely Visible Item Position () Ġ= ĠInt Array ( span Count ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Manager . find Last Comp let ely Visible Item Positions ( this ) ĊĠĠĠĠĠĠĠ Ġlast () ĊĠĠĠ Ġ} Ċ } Ċ