package Ġcom . ren yu . list visibility demo Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġvar Ġadapter : ĠMain Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbe ans : ĠArrayList < String > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠArrayList < String >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠIN ACTIVE _ LIST _ ITEM _ VIS IBILITY _ PERCENT S Ġ= Ġ 7 0 ĊĊĠĠĠ Ġ// Ġå½ĵåīį ç¬¬ä¸Ģä¸ª åı¯ è§ģ é¡¹ ä½įç½® ĊĠĠĠ Ġprivate Ġvar Ġtemp First Visible Item Ġ= Ġ 0 ĊĠĠĠ Ġ// Ġå½ĵåīį ç¬¬ä¸Ģä¸ª åı¯ è§ģ é¡¹ é¡¶ éĥ¨ åģı ç§» éĩı ĊĠĠĠ Ġprivate Ġvar Ġtemp First Visible Item Top Ġ= Ġ 0 ĊĠĠĠ Ġ// Ġæ » ļ åĬ¨ æĸ¹åĲĳ ĊĠĠĠ Ġenum Ġclass ĠScroll Direction Ġ{ ĊĠĠĠĠĠĠĠ ĠUp , ĠDown ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġå½ĵåīį æĸ¹åĲĳ ĊĠĠĠ Ġvar Ġdirection : ĠScroll Direction Ġ= ĠScroll Direction . Up ĊĠĠĠ Ġ// Ġæ » ļ åĬ¨ çĬ¶æĢģ ĊĠĠĠ Ġvar Ġscroll State : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar ĠmCurrent Item : ĠListItem Data Ġ= ĠListItem Data (- 1 , Ġnull , Ġfalse ) ĊĠĠĠ Ġvar Ġm Pre Active Item : ĠListItem Data Ġ= ĠListItem Data (- 1 , Ġnull , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġbe ans . add (" 0 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 2 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 3 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 4 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 5 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 6 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 7 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 8 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 9 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 0 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 1 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 2 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 3 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 4 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 5 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 6 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 7 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 8 ") ĊĠĠĠĠĠĠĠ Ġbe ans . add (" 1 9 ") ĊĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠMain Adapter ( beans , Ġthis , Ġrv _ main ) ĊĠĠĠĠĠĠĠ Ġrv _ main . layout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġrv _ main . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġrv _ main . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġrv _ main . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView ?, Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( re cyclerView Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Item Ġ= Ġ( re cyclerView . layout Manager Ġas ĠLinearLayoutManager ). findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetected Scroll Direction ( re cyclerView , Ġfirst Visible Item ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( scroll State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ IDLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ SET TL ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Touch Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ DR AG GING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Touch Scroll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView ?, ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ IDLE Ġ&& Ġadapter !!. item Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Idle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll State Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstate Touch Scroll () Ġ{ ĊĠĠĠĠĠĠĠ Ġcalculate Active Item () ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ å½ĵåīį çļĦ å®Įåħ¨ æĺ¾ç¤º é¡¹ ä¸İ åİŁ åħĪ çļĦ å®Įåħ¨ æĺ¾ç¤º é¡¹ ä¸į ä¸Ģèĩ´ ï¼Į åĪĻ æī§è¡Į æ¿Ģ æ´» ä¸İ åıį æ¿Ģ æ´» éħįç½® ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Item . changed Ġ&& Ġm Pre Active Item . index Ġ!= ĠmCurrent Item . index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¤ĦçĲĨ æĺ¾ç¤º é¡¹ åıĳçĶŁ åıĺåĮĸ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalculate Active Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Item Visibility Percent s Ġ= ĠUtils . get Visibility Percent s ( m Current Item . view !! ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Item Data Ġ= Ġwhen ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Up Ġ-> Ġfind Preview Item () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Down Ġ-> Ġfind Next Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( list Item Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æī¾åĪ° æĺ¾ç¤º é¡¹ ä¹ĭåĲİ ï¼Į å¦Ĥæŀľ æĹ§ çļĦ æĺ¾ç¤º é¡¹ å°ı äºİ IN ACTIVE _ LIST _ ITEM _ VIS IBILITY _ PERCENT S å¹¶ä¸Ķ æĸ°çļĦ æĺ¾ç¤º é¡¹ å¤§äºİ IN ACTIVE _ LIST _ ITEM _ VIS IBILITY _ PERCENT S çļĦæĹ¶åĢĻ ï¼Į åĪĻ è®¤ å®ļ æĺ¾ç¤º é¡¹ åıĳçĶŁ åıĺåĮĸ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Item Visibility Percent s Ġ= ĠUtils . get Visibility Percent s ( list Item Data . view !! ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" MainActivity ", Ġcurrent Item Visibility Percent s . toString ()+" Ġ"+ next Item Visibility Percent s . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IN ACTIVE _ LIST _ ITEM _ VIS IBILITY _ PERCENT S Ġin Ġ( currentItem Visibility Percent s Ġ+ Ġ 1 ) .. ( next Item Visibility Percent s Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetCurrent Item ( list Item Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥ æī¾ ä¸ĭ ä¸Ģä¸ª æĺ¾ç¤º é¡¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Next Item () Ġ: ĠListItem Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġrv _ main . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Item . index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĪ·æĸ° å½ĵåīį åħ¨éĥ¨ åı¯ è§ģ é¡¹ æĺ¾ç¤º æ¯Ķ ä¾ĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Percent () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Item Index Ġ= ĠmCurrent Item . index + 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Item Index Ġ< Ġadapter !!. item Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent View Position Ġ= Ġrv _ main . indexOf Child ( m Current Item . view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext View Ġ= Ġmanager . getChild At ( current View Position + 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠListItem Data ( next Item Index , Ġnext View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥ æī¾ ä¸Ĭ ä¸Ģä¸ª æĺ¾ç¤º é¡¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Preview Item () Ġ: ĠListItem Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġrv _ main . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Item . index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĪ·æĸ° å½ĵåīį åħ¨éĥ¨ åı¯ è§ģ é¡¹ æĺ¾ç¤º æ¯Ķ ä¾ĭ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Percent () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Item Index Ġ= ĠmCurrent Item . index - 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preview Item Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent View Position Ġ= Ġrv _ main . indexOf Child ( m Current Item . view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview View Ġ= Ġmanager . getChild At ( current View Position - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preview View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠListItem Data ( preview Item Index , Ġpreview View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĪ·æĸ° å½ĵåīį åħ¨éĥ¨ åı¯ è§ģ é¡¹ æĺ¾ç¤º æ¯Ķ ä¾ĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrefresh Percent () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġrv _ main . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrv _ main . indexOf Child ( m Current Item . view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġrv _ main . indexOf Child ( m Current Item . view ) Ġ- Ġ 1 Ġ- Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠmCurrent Item . index Ġ- Ġ 1 Ġ- Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= ĠUtils . get Visibility Percent s ( manager . getChild At ( temp )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. getItem ( position )?. set Percent ( percent ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" MainActivity ", Ġ"" Ġ+ Ġposition Ġ+ Ġ" Ġ" Ġ+ Ġpercent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrv _ main . child Count Ġ- Ġrv _ main . indexOf Child ( m Current Item . view )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠmCurrent Item . index Ġ+ Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Ġ= ĠUtils . get Visibility Percent s ( manager . getChild At ( rv _ main . indexOf Child ( m Current Item . view ) Ġ+ Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. getItem ( position )?. set Percent ( percent ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" MainActivity ", Ġ"" Ġ+ Ġposition Ġ+ Ġ" Ġ" Ġ+ Ġpercent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstate Idle () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Visible Item Position Ġ= Ġ( rv _ main . layout Manager Ġas ĠLinearLayoutManager ). findFirst Visible Item Position () ĊĠĠĠĠĠĠĠ Ġval Ġlast Visible Item Position Ġ= Ġ( rv _ main . layout Manager Ġas ĠLinearLayoutManager ). find Last Visible Item Position () ĊĠĠĠĠĠĠĠ Ġcalculate Most Visible Item ( first Visible Item Position , Ġlast Visible Item Position ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Item . index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Percent () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ å½ĵåīį çļĦ å®Įåħ¨ æĺ¾ç¤º é¡¹ ä¸İ åİŁ åħĪ çļĦ å®Įåħ¨ æĺ¾ç¤º é¡¹ ä¸į ä¸Ģèĩ´ ï¼Į åĪĻ æī§è¡Į æ¿Ģ æ´» ä¸İ åıį æ¿Ģ æ´» éħįç½® ĊĠĠĠĠĠĠĠ Ġif Ġ( m Current Item . changed Ġ&& Ġm Pre Active Item . index Ġ!= ĠmCurrent Item . index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æī¾åĪ° å®Įåħ¨ æĺ¾ç¤º é¡¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalculate Most Visible Item ( first Visible Item Position : ĠInt , Ġlast Visible Item Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Current Item Ġ= Ġget Mock Current Item ( first Visible Item Position , Ġlast Visible Item Position ) ĊĠĠĠĠĠĠĠ Ġval Ġmax Visibility Percent s Ġ= ĠUtils . get Visibility Percent s ( mock Current Item . view !! ) ĊĠĠĠĠĠĠĠ Ġwhen ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Up Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom To Top Most Visible Item ( mock Current Item , Ġmax Visibility Percent s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Down Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop To Bottom Most Visible Item ( mock Current Item , Ġmax Visibility Percent s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( mock Current Item . changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetCurrent Item ( mock Current Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® å½ĵåīį å®Įåħ¨ æĺ¾ç¤º é¡¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetCurrent Item ( mock Current Item : ĠListItem Data ) Ġ{ ĊĠĠĠĠĠĠĠ ĠmCurrent Item . changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠmCurrent Item . index Ġ= Ġmock Current Item . index ĊĠĠĠĠĠĠĠ ĠmCurrent Item . view Ġ= Ġmock Current Item . view ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ ¿ Ģ æ´» ä¸İ åıį æ¿Ģ æ´» åİŁ åħĪ ä¸İ å½ĵåīį å®Įåħ¨ æĺ¾ç¤º é¡¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġactive () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ æī¾åĪ° åİŁ åħĪ çļĦ å®Įåħ¨ æĺ¾ç¤º é¡¹ å¹¶ æī§è¡Į åıį æ¿Ģ æ´» ĊĠĠĠĠĠĠĠ Ġif Ġ( m Pre Active Item . index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter ?. getItem ( m Pre Active Item . index )?. de Active () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" MainActivity ", Ġ" åħ³éĹŃ "+ m Pre Active Item . index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ æī¾åĪ° å½ĵåīį çļĦ å®Įåħ¨ æĺ¾ç¤º é¡¹ å¹¶ æ¿Ģ æ´» ĊĠĠĠĠĠĠĠ Ġadapter ?. getItem ( m Current Item . index )?. setActive () Ċ // ĠĠĠĠĠĠĠ ĠLog . d (" MainActivity ", Ġ" æ¿Ģ æ´» "+ m Current Item . index ) ĊĠĠĠĠĠĠĠ ĠmCurrent Item . changed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠæĽ ¿ æį¢ ĊĠĠĠĠĠĠĠ Ġm Pre Active Item . changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Pre Active Item . index Ġ= ĠmCurrent Item . index ĊĠĠĠĠĠĠĠ Ġm Pre Active Item . view Ġ= ĠmCurrent Item . view ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbottom To Top Most Visible Item ( mock Current Item : ĠListItem Data , Ġmax Visibility Percent s : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġrv _ main . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġmax Visibility Percent s ĊĠĠĠĠĠĠĠ Ġ// Ġ çĶ± ä¸ĭ èĢĮ ä¸Ĭ å¾ªçİ¯ æŁ¥æī¾ ç¬¬ä¸Ģä¸ª å®Įåħ¨ æĺ¾ç¤º é¡¹ ĊĠĠĠĠĠĠĠ Ġval Ġmost Size Ġ= Ġrv _ main . indexOf Child ( mock Current Item . view ) ĊĠĠĠĠĠĠĠ Ġval Ġt emo Index Ġ= Ġmanager . find Last Visible Item Position () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. most Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent View Ġ= Ġmanager . getChild At ( most Size - i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Item Visibility Percent s Ġ= ĠUtils . get Visibility Percent s ( current View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentItem Visibility Percent s > temp Ġ&& Ġcurrent Item Visibility Percent s > IN ACTIVE _ LIST _ ITEM _ VIS IBILITY _ PERCENT S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġcurrent Item Visibility Percent s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Current Item . view Ġ= Ġcurrent View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Current Item . index Ġ= Ġt emo Index Ġ- Ġi ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Current Item . changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtop To Bottom Most Visible Item ( mock Current Item : ĠListItem Data , Ġmax Visibility Percent s : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġrv _ main . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġmax Visibility Percent s ĊĠĠĠĠĠĠĠ Ġval Ġt emo Index Ġ= Ġmanager . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrv _ main . indexOf Child ( mock Current Item . view ) Ġuntil Ġrv _ main . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent View Ġ= Ġmanager . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Item Visibility Percent s Ġ= ĠUtils . get Visibility Percent s ( current View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentItem Visibility Percent s > temp Ġ&& Ġcurrent Item Visibility Percent s > IN ACTIVE _ LIST _ ITEM _ VIS IBILITY _ PERCENT S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġcurrent Item Visibility Percent s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Current Item . view Ġ= Ġcurrent View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Current Item . index Ġ= Ġt emo Index + i ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Current Item . changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åģĩ å®ļ ä¸Ģä¸ª å½ĵåīį å®Įåħ¨ æĺ¾ç¤º é¡¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Mock Current Item ( first Visible Item Position : ĠInt , Ġlast Visible Item Position : ĠInt ) Ġ: ĠListItem Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġrv _ main . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä»İ ä¸Ĭ å¾Ģ ä¸ĭ æĭī çļĦæĹ¶åĢĻ éĢīæĭ© æľĢåĲİ ä¸Ģä¸ª åı¯ è§ģ é¡¹ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Up Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠListItem Data ( last Visible Item Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . getChild At ( rv _ main . child Count - 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä»İ ä¸ĭ å¾Ģ ä¸Ĭ æĭī çļĦæĹ¶åĢĻ éĢīæĭ© ç¬¬ä¸Ģä¸ª åı¯ è§ģ é¡¹ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Down Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠListItem Data ( first Visible Item Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . getChild At ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪ¤æĸŃ æ»ļ åĬ¨ æĸ¹åĲĳ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdetected Scroll Direction ( re cyclerView : ĠRecyclerView , Ġfirst Visible Item : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġå½ĵåīį æľĢ ä¸Ĭ æĸ¹ åı¯ è§ģ è§ĨåĽ¾ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Visible View Ġ= Ġre cyclerView . layout Manager . getChild At ( 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġfirst Visible View . top ĊĠĠĠĠĠĠĠ Ġif Ġ( first Visible Item Ġ== Ġtemp First Visible Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä»İ ä¸Ĭ åĲĳ ä¸ĭ æĭī ï¼Į RecyclerView æ¸²æŁĵ ä¼ļ è°ĥçĶ¨ on Sc rolled æĸ¹æ³ķ ï¼Į åĽłæŃ¤ è¿ĻéĩĮ åı¯èĥ½ åŃĺåľ¨ ä¸į æ»ĳ åĬ¨ çļĦ æĥħåĨµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( top > temp First Visible Item Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= ĠScroll Direction . Up ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( top < temp First Visible Item Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= ĠScroll Direction . Down ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä»İ ä¸Ĭ åĲĳ ä¸ĭ æĭī ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirection Ġ= Ġif Ġ( first Visible Item Ġ< Ġtemp First Visible Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Up ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Direction . Down ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtemp First Visible Item Ġ= Ġfirst Visible Item ĊĠĠĠĠĠĠĠ Ġtemp First Visible Item Top Ġ= Ġtop ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ è¡Į ä¿¡æģ¯ æķ°æį® å°ģè£ħ Ċ Ġ* Ġ@ param Ġindex Ġå½ĵåīį é¡¹ åľ¨ RecyclerView ä¸ŃçļĦ ä½įç½® Ċ Ġ* Ġ@ param Ġview Ġå½ĵåīį é¡¹ è§ĨåĽ¾ Ċ Ġ* Ġ@ param Ġchanged Ġå½ĵåīį é¡¹ æĺ¯åĲ¦ åıĳçĶŁ æĺ¾ç¤º ä¸ĬçļĦ åıĺåĮĸ Ċ Ġ*/ Ċ data Ġclass ĠListItem Data ( var Ġindex : ĠInt Ġ= Ġ- 1 , Ġvar Ġview : ĠView ?, Ġvar Ġchanged : ĠBoolean Ġ= Ġfalse )