package Ġapp . base . mv vm . vm . list Ċ Ċ import Ġandroidx . databinding . Observable Boolean Ċ import Ġandroidx . databinding . Observable Int Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġapp . base . mv vm . repository . I Repository Ċ import Ġapp . base . mv vm . view . I View Ċ import Ġapp . base . mv vm . vm . Base VM Ċ import Ġapp . base . widget . IL o ad More Ċ import Ġio . reactivex . Observer Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġdan iel Ġon Ġ 1 8 - 1 - 1 5 . Ċ Ġ*/ Ċ abstract Ġclass ĠBase List VM < Rep Ġ: ĠI Repository , ĠV Ġ: ĠI View , ĠD Ġ: ĠAny > Ġ: ĠI Load More , ĠObserver < List < D >>, ĠBase VM < Rep , ĠV >() Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġlayout Manager : ĠRecyclerView . LayoutManager ĊĠĠĠ Ġlateinit Ġvar Ġ Ġadapter : ĠBase ListAdapter < D > ĊĠĠĠ Ġopen Ġvar ĠPAGE _ SIZE Ġ= Ġ 2 5 ĊĠĠĠ Ġprivate Ġvar ĠcurrentPage Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġrefresh ing Ġ= ĠObservable Boolean ( false ) ĊĠĠĠ Ġvar Ġloading Ġ= Ġfalse ĊĊĊĠĠĠ Ġval Ġstatus Ġ= ĠObservable Int ( STATUS _ EMPTY ) ĊĊĠĠĠ Ġopen Ġfun Ġinitialize ( repository : Rep , view : V , layout Manager : ĠRecyclerView . LayoutManager , adapter : ĠBase ListAdapter < D > ){ ĊĠĠĠĠĠĠĠ Ġsuper . initialize ( repository , Ġview ) ĊĠĠĠĠĠĠĠ Ġthis . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġthis . adapter . load More Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġthis . layout Manager Ġ= Ġlayout Manager ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġval Ġrefresh ing Listener Ġ= ĠSw ipe Refresh Layout . On Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġload Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠonLoad Data ( currentPage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonLoad More () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠcurrentPage ++ ĊĠĠĠĠĠĠĠ ĠonLoad Data ( currentPage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun ĠonLoad Data ( page : ĠInt ) ĊĊĊĠĠĠ Ġfun Ġbind Result ( result : ĠList < D > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh ing . set ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġresult ?. size Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ< ĠPAGE _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . footer Type Ġ= ĠBase ListAdapter . TYPE _ FO OTER _ NO _ MORE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . footer Type Ġ= ĠBase ListAdapter . TYPE _ FO OTER _ LOADING ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Set Ġ= Ġmutable ListOf < D >() ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull Ġ&& Ġsize Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Set . addAll ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setData ( list Set ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! list Set . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . addAll ( list Set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstatus . set ( if ( adapter . item Count Ġ> Ġ 0 ) ĠSTATUS _ CONTENT Ġelse ĠSTATUS _ EMPTY ) ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind Error ( errorCode : ĠInt , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrefresh ing . set ( false ) ĊĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . footer Type Ġ= ĠBase ListAdapter . TYPE _ FO OTER _ ERROR ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . set ( STATUS _ ERROR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġbind Error (- 1 , Ġ" ç½ĳç»ľ éĶĻè¯¯ , ç¨ į åĲİ åĨį è¯ķ ") ĊĠĠĠĠĠĠĠ Ġview . dismiss Loading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Next ( t : ĠList < D >) Ġ{ ĊĠĠĠĠĠĠĠ Ġbind Result ( t ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠ Ġview . dismiss Loading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . show Loading () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTATUS _ CONTENT Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTATUS _ EMPTY Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTATUS _ ERROR Ġ= Ġ- 1 ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ