package Ġcom . air bnb . e po xy . sample . test module Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . core . view . do On Detach Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . air bnb . e po xy . Async E po xy Controller Ċ import Ġcom . air bnb . e po xy . E po xy Controller Ċ import Ġcom . air bnb . e po xy . E po xy Controller Adapter Ċ import Ġcom . air bnb . e po xy . E po xy Holder Ċ import Ġcom . air bnb . e po xy . E po xy Model Ċ import Ġcom . air bnb . e po xy . E po xy Visibility Tracker Ċ import Ġjava . util . LinkedList Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ object ĠE po xy Util Ġ{ ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġassemble Static List ( ĊĠĠĠĠĠĠĠ Ġre cyclerView : ĠRecyclerView , ĊĠĠĠĠĠĠĠ Ġdata List : ĠList < T >, ĊĠĠĠĠĠĠĠ Ġheader Builder : Ġ(() Ġ-> ĠE po xy Model <* >) ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠmodelBuilder : Ġ( pos : ĠInt , Ġmodel : ĠT ) Ġ-> ĠE po xy Model <* >, ĊĠĠĠĠĠĠĠ Ġinitial Callback : Ġ( re cyclerView : ĠRecyclerView ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠStatic List E po xy Controller < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġinitial Callback . invoke ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠStatic List E po xy Controller ( model Builder , Ġheader Builder ) ĊĠĠĠĠĠĠĠ Ġbasic RecyclerView Init ( re cyclerView , Ġcontroller ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġcontroller . adapter ĊĠĠĠĠĠĠĠ Ġcontroller . set Datas ( data List ) ĊĠĠĠĠĠĠĠ Ġ// ĠE po xy Controller æľī ä¸ª bug ï¼Į é»ĺè®¤ ä¼ļ åľ¨ ä¸» çº¿ç¨ĭ æī§è¡Į model Ġbuild åĴĮ diff ï¼Į Ġ å¯¼èĩ´ å¼¹ çªĹ å¼¹ èµ· åĬ¨çĶ» æľī å¤§äºİ 1 0 0 ms çļĦ åį¡ é¡ ¿ ĊĠĠĠĠĠĠĠ Ġ// Ġ åį³ ä½¿ å·²ç»ı çĶ¨ Async E po xy Controller æĮĩå®ļ äºĨ çº¿ç¨ĭ ï¼Į ä½¿çĶ¨ request Model Build () ç¬¬ ä¸Ģæ¬¡ å¹¶ æ²¡ ä½¿çĶ¨ handler åĪĩæį¢ åĪ° åŃĲ çº¿ç¨ĭ ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ ä½¿çĶ¨ request Delayed Model Build ï¼Į åĪĻ åı¯ä»¥ çĶ¨ handler åĪĩæį¢ åĪ° åŃĲ çº¿ç¨ĭ ĊĠĠĠĠĠĠĠ Ġcontroller . request Delayed Model Build ( 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontroller ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbasic RecyclerView Init ( re cyclerView : ĠRecyclerView , Ġcontroller : ĠE po xy Controller ){ ĊĠĠĠĠĠĠĠ Ġval Ġe po xy Visibility Tracker Ġ= ĠE po xy Visibility Tracker () ĊĠĠĠĠĠĠĠ Ġe po xy Visibility Tracker . attach ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġ( re cyclerView . layout Manager Ġas ? ĠGrid LayoutManager )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . span Count Ġ= Ġspan Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspan Size Lookup Ġ= Ġcontroller . span Size Lookup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle Children On Detach Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ( re cyclerView . layout Manager Ġas ? ĠLinearLayoutManager )?. apply { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle Children On Detach Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView . do On Detach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ éĿĻæĢģ åĪĹè¡¨ çĶ¨çļĦ E po xy Controller Ċ Ġ*/ Ċ class ĠStatic List E po xy Controller < T Ġ: ĠAny >( ĊĠĠĠ Ġprivate Ġval ĠmodelBuilder : Ġ( pos : ĠInt , Ġitem : ĠT ) Ġ-> ĠE po xy Model <* >, ĊĠĠĠ Ġprivate Ġval Ġheader Builder : Ġ(() Ġ-> ĠE po xy Model <* >) ? Ġ= Ġnull Ċ ) Ġ: ĠAsync E po xy Controller ( true , Ġtrue ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsource Datas : ĠList < T > Ġ?= Ġnull ĊĠĠĠ Ġprivate Ġval Ġmodel Map Ġ= ĠConcurrent HashMap < Int , ĠBase E po xy Model With Holder <* >>() ĊĊĠĠĠ Ġfun Ġset Datas ( datas : ĠList < T > ){ ĊĠĠĠĠĠĠĠ Ġsource Datas Ġ= Ġdatas ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Models () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġheader ĊĠĠĠĠĠĠĠ Ġheader Builder ?. invoke ()?. addTo ( this ) ĊĊĠĠĠĠĠĠĠ Ġsource Datas ?. forEach Indexed Ġ{ Ġindex , Ġd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmodelBuilder ( index , Ġd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠBase E po xy Model With Holder ){ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalive Model Map Ġ= Ġmodel Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrequest Model Build () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Delayed Model Build ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From RecyclerView ( re cyclerView ) ĊĠĠĠĠĠĠĠ Ġmodel Map . clear () ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠE po xy Debugger { ĊĠĠĠ Ġval Ġmap Ġ= Ġhash Map Of < Sample E po xy Model . Holder , ĠLinkedList < Sample E po xy Model >>() ĊĠĠĠ Ġfun Ġadd ( holder : ĠSample E po xy Model . Holder , Ġmodel : ĠSample E po xy Model ){ ĊĠĠĠĠĠĠĠ Ġif ( map . containsKey ( holder )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ holder ]?. add ( model ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ holder ] Ġ= ĠLinkedList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ holder ]?. add ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( holder : ĠSample E po xy Model . Holder , Ġmodel : ĠSample E po xy Model ){ ĊĠĠĠĠĠĠĠ Ġif ( map . containsKey ( holder )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ holder ]?. remove ( model ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck (){ ĊĠĠĠĠĠĠĠ Ġmap . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . value . size Ġ> Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstr Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr Ġ+= Ġit . title Ġ+ Ġ"," ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" yy j 1 ", Ġ" check Ġerror : Ġ$ str ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ