package Ġcom . xia oc y dx . cx rv . paging Ċ Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . RecyclerView . ViewHolder Ċ import Ġandroidx . recyclerview . widget . Simple ViewHolder Ċ import Ġcom . xia oc y dx . cx rv . concat . View Adapter Ċ import Ġcom . xia oc y dx . cx rv . internal . has Display Item Ċ import Ġcom . xia oc y dx . cx rv . item visible . find Last Comp let ely Visible Item Position Ċ import Ġcom . xia oc y dx . cx rv . item visible . find Last Visible Item Position Ċ import Ġcom . xia oc y dx . cx rv . item visible . is First Item Comp let ely Visible Ċ import Ġcom . xia oc y dx . cx rv . list . ListAdapter Ċ import Ġcom . xia oc y dx . cx rv . list . List Changed Listener Ċ Ċ /** Ċ Ġ* Ġ åĬłè½½ å°¾ éĥ¨ éĢĤ éħį åĻ¨ Ċ Ġ* Ċ Ġ* Ġ@ author Ġx cc Ċ Ġ* Ġ@ date Ġ 2 0 2 1 / 9 / 1 7 Ċ Ġ*/ Ċ internal Ġclass ĠLoad Footer Adapter ( ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠLoad Footer Config , ĊĠĠĠ Ġprivate Ġval Ġadapter : ĠList Adapter < *, Ġ*> Ċ ) Ġ: ĠView Adapter < ViewHolder >(), ĠLoad States Listener , ĠList Changed Listener < Any > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġvisible : ĠVis ible Ġ= ĠVis ible . NONE ĊĠĠĠ Ġprivate Ġvar Ġis Post p one Handle Fully Visible Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġload States : ĠLoad States Ġ= ĠLoad States . Incomplete ĊĠĠĠ Ġprivate Ġvar Ġpre Draw Listener : ĠPre Draw Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcollector Ġ= Ġadapter . paging Collector ĊĠĠĠĠĠĠĠ Ġconfig . complete ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry Ġ= Ġcollector :: retry , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġ{ Ġcollector . load States . exception Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadapter . add List Changed Listener ( this ) ĊĠĠĠĠĠĠĠ Ġcollector . add Load States Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType (): ĠInt Ġ= ĠhashCode () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠitemView Ġ= ĠLoad View Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġparent . context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġconfig . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġconfig . height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Item Ġ= Ġconfig . loading Scope ?. getView Item (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Item Ġ= Ġconfig . fully Scope ?. getView Item (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Item Ġ= Ġconfig . failure Scope ?. getView Item () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSimple ViewHolder ( item View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( ĊĠĠĠĠĠĠĠ Ġholder : ĠViewHolder ĊĠĠĠ Ġ): ĠUnit Ġ= Ġwith ( holder . item View Ġas ĠLoad View Layout ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVis ible . LOADING Ġ-> Ġloading Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVis ible . FAILURE Ġ-> Ġfailure Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVis ible . FULL Y Ġ-> Ġsuccess Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVis ible . NONE Ġ-> Ġthrow ĠAssertionError (" å±Ģ éĥ¨ åĪ·æĸ° åĩºçİ° æĸŃ è¨Ģ å¼Ĥå¸¸ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĬłè½½ å®Įåħ¨ åĲİ ï¼Į åľ¨ åĪĹè¡¨ æĽ´æĶ¹ æĹ¶ æĽ´æĸ° åĬłè½½ å®Įåħ¨ è§ĨåĽ¾ çļĦ æĺ¾ç¤º æĥħåĨµ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** æ³¨æĦı ** ï¼ļ[ on List Changed ] åľ¨ [ on Load States Changed ] ä¹ĭåīį è¢« è°ĥçĶ¨ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon List Changed ( current : ĠList < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Display Item Ġ= Ġadapter . has Display Item ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! load States . is Fully Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ== ĠVis ible . FULL Y Ġ&& Ġhas Display Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġconfig . is Fully Visible While Ex ceed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæŃ¤ æĹ¶ FULL Y è§ĨåĽ¾ å·² æĺ¾ç¤º ï¼Į å¹¶ä¸Ķ åĪĹè¡¨ å·² æĽ´æĶ¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost p one Handle Fully Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ== ĠVis ible . FULL Y Ġ&& Ġ! has Display Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæŃ¤ æĹ¶ FULL Y è§ĨåĽ¾ å·² æĺ¾ç¤º ï¼Į å¹¶ä¸Ķ åĪĹè¡¨ å·² ç©º ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Load Footer ( Visible . NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ== ĠVis ible . NONE Ġ&& Ġhas Display Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæŃ¤ æĹ¶ FULL Y è§ĨåĽ¾ æľª æĺ¾ç¤º ï¼Į å¹¶ä¸Ķ åĪĹè¡¨ ä¸į ä¸ºç©º ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . is Fully Visible While Ex ceed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost p one Handle Fully Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Load Footer ( Visible . FULL Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonLoad States Changed ( previous : ĠLoad States , Ġcurrent : ĠLoad States ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload States Ġ= Ġcurrent ĊĠĠĠĠĠĠĠ Ġval Ġvisible Ġ= Ġcurrent . to Visible () ĊĠĠĠĠĠĠĠ Ġif Ġ( visible Ġ== ĠVis ible . FULL Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æľ« å°¾ åĬłè½½ å®Įåħ¨ æĹ¶ ï¼Į ä¼ļ åľ¨ FULL Y è§ĨåĽ¾ åīį éĿ¢ æıĴåħ¥ item ï¼Į ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ èĭ¥ æŃ¤ æĹ¶ æľī item åĬ¨çĶ» ï¼Į åĪĻ FULL Y è§ĨåĽ¾ çľĭ èµ·æĿ¥ åĥı æĺ¯ è¢« âĢľ æĮ ¤ ä¸ĭ åİ» âĢĿï¼Į ä½ĵ éªĮ å¹¶ ä¸į å¥½ ï¼Į ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĽłæŃ¤ åħĪ ç§»éĻ¤ load Footer ï¼Į åľ¨ RV å¸ĥå±Ģ æµģç¨ĭ å®ĮæĪĲ åĲİ ï¼Į åĪ¤æĸŃ æĺ¯åĲ¦ æĺ¾ç¤º FULL Y è§ĨåĽ¾ ãĢĤ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost p one Handle Fully Visible () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Load Footer ( visible ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠLoad States . to Visible (): ĠVis ible Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġ! adapter . has Display Item Ġ-> ĠVis ible . NONE ĊĠĠĠĠĠĠĠ Ġthis . is Fully Ġ-> Ġif Ġ( config . fully Scope Ġ!= Ġnull ) ĠVis ible . FULL Y Ġelse ĠVis ible . NONE ĊĠĠĠĠĠĠĠ Ġappend . isIn complete Ġ-> ĠVis ible . NONE ĊĠĠĠĠĠĠĠ Ġappend . isLoading Ġ-> Ġif Ġ( config . loading Scope Ġ!= Ġnull ) ĠVis ible . LOADING Ġelse ĠVis ible . NONE ĊĠĠĠĠĠĠĠ Ġappend . is Failure Ġ-> Ġif Ġ( config . failure Scope Ġ!= Ġnull ) ĠVis ible . FAILURE Ġelse ĠVis ible . NONE ĊĠĠĠĠĠĠĠ Ġappend . is Success Ġ-> ĠVis ible . NONE ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvisible ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Load Footer ( visible : ĠVis ible ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . visible Ġ!= Ġvisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . visible Ġ= Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Item ( show Ġ= Ġvisible Ġ!= ĠVis ible . NONE , Ġanim Ġ= ĠNeed Anim . NOT _ ALL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġåľ¨ [ handle Fully Visible While Pre Draw ] è¢« è°ĥçĶ¨ æĹ¶ åĪ¤æĸŃ æĺ¯åĲ¦ æĺ¾ç¤º FULL Y è§ĨåĽ¾ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ åħĪ ç§»éĻ¤ ` load Footer ` æĺ¯ ä¸ºäºĨ æ»¡è¶³ ä¸¤ç§į åľºæĻ¯ ï¼ļ ĊĠĠĠĠ Ġ* Ġ 1 . Ġå½ĵ ` config . is Fully Visible While Ex ceed Ġ= Ġtrue ` æĹ¶ ï¼Į ĊĠĠĠĠ Ġ* ĠéľĢè¦ģ åħĪ ç§»éĻ¤ ` load Footer `ï¼Į æīįèĥ½ åľ¨ RV å¸ĥå±Ģ æµģç¨ĭ å®ĮæĪĲ åĲİ ï¼Į åĪ¤æĸŃ æĺ¯åĲ¦ æĺ¾ç¤º FULL Y è§ĨåĽ¾ ãĢĤ ĊĠĠĠĠ Ġ* Ġ 2 . Ġ æľ« å°¾ åĬłè½½ å®Įåħ¨ æĹ¶ ï¼Į ä¼ļ åľ¨ FULL Y è§ĨåĽ¾ åīį éĿ¢ æıĴåħ¥ item ï¼Į ĊĠĠĠĠ Ġ* Ġ èĭ¥ æŃ¤ æĹ¶ æľī item åĬ¨çĶ» ï¼Į åĪĻ FULL Y è§ĨåĽ¾ çľĭ èµ·æĿ¥ åĥı æĺ¯ è¢« âĢľ æĮ ¤ ä¸ĭ åİ» âĢĿï¼Į ä½ĵ éªĮ å¹¶ ä¸į å¥½ ï¼Į ĊĠĠĠĠ Ġ* Ġ åĽłæŃ¤ åħĪ ç§»éĻ¤ ` load Footer `ï¼Į åľ¨ RV å¸ĥå±Ģ æµģç¨ĭ å®ĮæĪĲ åĲİ ï¼Į åĪ¤æĸŃ æĺ¯åĲ¦ æĺ¾ç¤º FULL Y è§ĨåĽ¾ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġpost p one Handle Fully Visible () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Load Footer ( Visible . NONE ) ĊĠĠĠĠĠĠĠ Ġis Post p one Handle Fully Visible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯¥ åĩ½æķ° åľ¨ è§ĨåĽ¾ æłĳ draw ä¹ĭåīį è¢« è°ĥçĶ¨ ï¼Į åį³ RV å¸ĥå±Ģ æµģç¨ĭ å®ĮæĪĲ åĲİ è¢« è°ĥçĶ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Fully Visible While Pre Draw () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Post p one Handle Fully Visible ) Ġreturn ĊĠĠĠĠĠĠĠ Ġassert ( visible Ġ== ĠVis ible . NONE ) Ġ{ Ġ" åĪ¤æĸŃ æĺ¯åĲ¦ æĺ¾ç¤º FULL Y è§ĨåĽ¾ åĩºçİ° æĸŃ è¨Ģ å¼Ĥå¸¸ " Ġ} ĊĠĠĠĠĠĠĠ Ġis Post p one Handle Fully Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġrv Ġ= Ġre cyclerView Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! config . is Fully Visible While Ex ceed Ġ|| Ġ! rv . is First Item Comp let ely Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Load Footer ( Visible . FULL Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Visible Position Ġ= Ġrv . find Last Visible Item Position () ĊĠĠĠĠĠĠĠ Ġval Ġlast Comp let ely Visible Position Ġ= Ġrv . find Last Comp let ely Visible Item Position () ĊĠĠĠĠĠĠĠ Ġval Ġis Ex ceed Ġ= Ġlast Visible Position Ġ!= Ġlast Comp let ely Visible Position ĊĠĠĠĠĠĠĠ Ġupdate Load Footer ( if Ġ( is Ex ceed ) ĠVis ible . FULL Y Ġelse ĠVis ible . NONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġpre Draw Listener Ġ= ĠPre Draw Listener ( re cyclerView , Ġ:: handle Fully Visible While Pre Draw ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġpre Draw Listener ?. remove Listener () ĊĠĠĠĠĠĠĠ Ġpre Draw Listener Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠVis ible Ġ{ ĊĠĠĠĠĠĠĠ ĠNONE , ĠLO ADING , ĠFAILURE , ĠFULL Y ĊĠĠĠ Ġ} Ċ }