package Ġrv . adapter . core . listener Ċ Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ Ċ /** Ċ Ġ* Ġby Ġy Ġon Ġ 2 0 1 6 / 1 1 / 1 5 Ċ Ġ*/ Ċ internal Ġclass ĠX Scroll Listener ( private Ġval Ġscroll Bottom : Ġ() Ġ-> ĠUnit ) Ġ: ĊĠĠĠ ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO _ MANAGER Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLINE AR Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠST AG GER ED _ GRID Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlayout Manager Type : ĠInt Ġ= ĠNO _ MANAGER ĊĠĠĠ Ġprivate Ġvar Ġlast Visible Item Position : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġscroll ItemCount : ĠInt Ġ= Ġ 1 ĊĊĠĠĠ Ġfun Ġupdate Scroll ItemCount ( value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . scroll ItemCount Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( layout Manager Type Ġ== ĠNO _ MANAGER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Type Ġ= Ġwhen Ġ( layout Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLinearLayoutManager Ġ-> ĠLINE AR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSt agger ed Grid LayoutManager Ġ-> ĠST AG GER ED _ GRID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unsupported ĠLayout Manager Ġused . ĠValid Ġones Ġare ĠLinearLayoutManager , ĠGrid LayoutManager Ġand ĠSt agger ed Grid LayoutManager ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( layout Manager Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLINE AR Ġ-> Ġlast Visible Item Position Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( layout Manager Ġas ĠLinearLayoutManager ). find Last Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠST AG GER ED _ GRID Ġ-> Ġlast Visible Item Position Ġ= Ġfind Max ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( layout Manager Ġas ĠSt agger ed Grid LayoutManager ). find Last Visible Item Positions ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager ĊĠĠĠĠĠĠĠ Ġval Ġvisible ItemCount Ġ= Ġlayout Manager ?. child Count Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtotal ItemCount Ġ= Ġlayout Manager ?. item Count Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( visible ItemCount Ġ> Ġ 0 Ġ&& ĠnewState Ġ== ĠRecyclerView . SCROLL _ STATE _ IDLE Ġ&& Ġlast Visible Item Position Ġ>= Ġtotal ItemCount Ġ- Ġscroll ItemCount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Bottom . invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Max ( last Positions : ĠInt Array ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmax Ġ= Ġlast Positions [ 0 ] ĊĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġlast Positions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmax ĊĠĠĠ Ġ} Ċ Ċ } Ċ