package Ġcom . id an atz . one adapter . internal . paging Ċ Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ import Ġcom . id an atz . one adapter . internal . utils . Logger Ċ import Ġcom . id an atz . one adapter . internal . utils . extensions . find Last Visible Item Position Ċ Ċ internal Ġclass ĠOne Scroll Listener Ġ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlayout Manager : ĠRecyclerView . LayoutManager , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġvisible Threshold : ĠInt , Ġ// ĠThe Ġminimum Ġamount Ġof Ġitems Ġto Ġhave Ġbelow Ġyour Ġcurrent Ġscroll Ġposition Ġbefore Ġloading Ġmore . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġload More Observer : ĠLoad More Observer , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ċ ) Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠcurrentPage Ġ= Ġ 0 Ġ// ĠThe Ġcurrent Ġoffset Ġindex Ġof Ġdata Ġyou Ġhave Ġloaded ĊĠĠĠ Ġprivate Ġvar Ġprevious Total ItemCount Ġ= Ġ 0 Ġ// ĠThe Ġtotal Ġnumber Ġof Ġitems Ġin Ġthe Ġdata Ġset Ġafter Ġthe Ġlast Ġload ĊĠĠĠ Ġprivate Ġvar Ġloading Ġ= Ġfalse Ġ// ĠTrue Ġif Ġwe Ġare Ġstill Ġwaiting Ġfor Ġthe Ġlast Ġset Ġof Ġdata Ġto Ġload . ĊĠĠĠ Ġprivate Ġval Ġstarting Page Index Ġ= Ġ 0 Ġ// ĠSets Ġthe Ġstarting Ġpage Ġindex ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( layout Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGrid LayoutManager Ġ-> Ġvisible Threshold Ġ*= Ġlayout Manager . span Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSt agger ed Grid LayoutManager Ġ-> Ġvisible Threshold Ġ*= Ġlayout Manager . span Count ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreset State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġhappens Ġmany Ġtimes Ġa Ġsecond Ġduring Ġa Ġscroll , Ġso Ġbe Ġw ary Ġof Ġthe Ġcode Ġyou Ġplace Ġhere . ĊĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( view : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is User Sc rolled ( view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĉ ĉ handle Loading Event () Ċ ĉ } ĊĊ ĉ fun Ġhandle Loading Event () Ġ{ Ċĉ ĉ if Ġ(! load More Observer . should Handle Loading Event ()) Ġ{ Ċĉĉ ĉ return Ċĉ ĉ } ĊĊĉ ĉ when Ġ( evaluate Loading State ()) Ġ{ Ċĉĉ ĉ Loading State . Finish Loading Ġ-> Ġ{ Ċĉĉĉ ĉ loading Ġ= Ġfalse Ċĉĉĉ ĉ load More Observer . on Loading StateChanged ( loading ) Ċĉĉ ĉ } Ċĉĉ ĉ Loading State . Loading Started Ġ-> Ġ{ Ċĉĉĉ ĉ loading Ġ= Ġtrue Ċĉĉĉ ĉ load More Observer . on Loading StateChanged ( loading ) Ċĉĉĉ ĉ currentPage ++ Ċĉĉĉ ĉ load More Observer . on Load More ( currentPage ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġ{ Ġ} Ċĉ ĉ } ĊĊĉ ĉ // Ġupdate Ġthe Ġprevious Ġitem Ġcount Ġto Ġthe Ġcurrent Ġitem Ġcount Ċĉ ĉ this . previous Total ItemCount Ġ= Ġlayout Manager . item Count Ċ ĉ } ĊĊ ĉ fun Ġreset State () Ġ{ ĊĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġstarting Page Index ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprevious Total ItemCount Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis User Sc rolled ( view : ĠRecyclerView ) Ġ= Ġview . scroll State Ġ!= ĠRecyclerView . SCROLL _ STATE _ IDLE ĊĊĠĠĠ Ġprivate Ġfun Ġevaluate Loading State (): ĠLoading State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Item Index Ġ= Ġlayout Manager . item Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġlast Visible Item Index Ġ= Ġlayout Manager . find Last Visible Item Position () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Finished ( last Item Index ) Ġ-> ĠLoading State . Finish Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Start Loading ( last Visible Item Index , Ġlast Item Index ) Ġ-> ĠLoading State . Loading Started ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ-> ĠLoading State . Mid Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLoading State . Normal ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= ĠLoading State . Normal ) Ġlogger . log d Ġ{ Ġ" on Sc rolled Ġ-> Ġloading Ġstate : Ġ$ it " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Start Loading ( last Visible Item Index : ĠInt , Ġlast Item Index : ĠInt ) Ġ= Ġ! loading Ġ&& Ġlast Visible Item Index Ġ+ Ġvisible Threshold Ġ>= Ġlast Item Index ĊĠĠĠ Ġprivate Ġfun ĠisLoading Finished ( last Item Index : ĠInt ) Ġ= Ġloading Ġ&& Ġlast Item Index Ġ> Ġ( previous Total ItemCount Ġ+ Ġ 1 ) Ġ// Ġ+ Ġ 1 Ġfor Ġthe Ġloading Ġholder ĊĊĠĠĠ Ġenum Ġclass ĠLoading State Ġ{ ĊĠĠĠĠĠĠĠ ĠNormal , ĠLoading Started , ĠMid Loading , ĠFinish Loading ĊĠĠĠ Ġ} Ċ }