package Ġcom . tak w olf . android . demo . refresh and load more . vm Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . tak w olf . android . h fre cycler view . load more footer . Load More State Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ Ċ abstract Ġclass ĠP aging ViewModel < Entity , ĠP aging Params > Ġ: ĠList ViewModel < Entity >() Ġ{ ĊĠĠĠ Ġval Ġrefresh State Data Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval Ġload More State Data Ġ= ĠMutable LiveData ( Load More State . DISABLED ) ĊĠĠĠ Ġprivate Ġvar Ġis Refresh Do ing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Load More Do ing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġversion Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġpaging Params : ĠP aging Params ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Finished Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Refresh Do ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh State Data . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh Do ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġdo Refresh () ĊĊĠĠĠ Ġprotected Ġfun Ġrefresh Success ( entities : ĠList < Entity >, Ġpaging Params : ĠP aging Params , Ġis Finished : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentities Data . value Ġ= ĠArrayList ( entities ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Paging ViewModel . paging Params Ġ= Ġpaging Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Paging ViewModel . is Finished Ġ= Ġis Finished ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh Do ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh State Data . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Load More Do ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload More State Data . value Ġ= Ġif Ġ( is Finished ) ĠLoad More State . FINISHED Ġelse ĠLoad More State . END LESS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġrefresh Failure () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Refresh Do ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh State Data . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload More () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Load More Do ing Ġ&& Ġ! is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload More State Data . value Ġ= ĠLoad More State . LOADING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Load More Do ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Load More ( version , Ġpaging Params !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġdo Load More ( version : ĠInt , Ġpaging Params : ĠP aging Params ) ĊĊĠĠĠ Ġprotected Ġfun Ġload More Success ( version : ĠInt , Ġadded Entities : ĠList < Entity >, Ġpaging Params : ĠP aging Params , Ġis Finished : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . version Ġ== Ġversion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities Data . value ?. let Ġ{ Ġentities Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities . addAll ( added Entities ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities Data . value Ġ= Ġentities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Paging ViewModel . paging Params Ġ= Ġpaging Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Paging ViewModel . is Finished Ġ= Ġis Finished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Load More Do ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload More State Data . value Ġ= Ġif Ġ( is Finished ) ĠLoad More State . FINISHED Ġelse ĠLoad More State . END LESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġload More Failure ( version : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . version Ġ== Ġversion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Load More Do ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload More State Data . value Ġ= ĠLoad More State . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ