package Ġcom . unsplash . photo . ui . adapters Ċ Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . paging . Paged ListAdapter Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġcom . unsplash . photo . repository . base . Network State Ċ import Ġcom . unsplash . photo . ui . adapters . view holder . Base ViewHolder Ċ import Ġcom . unsplash . photo . ui . adapters . view holder . Loading ViewHolder Ċ Ċ abstract Ġclass ĠBase Paged Adapter < M >( ĊĠĠĠ Ġdiff Callback : ĠDiff Util . Item Callback < M ? >, ĊĠĠĠ Ġprivate Ġval Ġretry Callback : Ġ() Ġ-> ĠUnit Ċ ) Ġ: ĠP aged ListAdapter < M , ĠBase ViewHolder < M >>( diff Callback ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġnetwork State : ĠNetwork State ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġhas Extra Row () Ġ= Ġnetwork State Ġ!= Ġnull Ġ&& Ġnetwork State Ġ!= ĠNetwork State . LOADED ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Extra Row () Ġ&& Ġposition Ġ== Ġitem Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFO OTER _ VIEW _ TYPE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONTENT _ VIEW _ TYPE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġcontent ViewHolder ( parent : ĠViewGroup ): ĠBase ViewHolder < M > ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠBase ViewHolder < M > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( view Type Ġ== ĠCONTENT _ VIEW _ TYPE ) Ġcontent ViewHolder ( parent ) Ġelse ĠLoading ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry Callback ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠBase ViewHolder < M >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getItem ViewType ( position ) Ġ== ĠCONTENT _ VIEW _ TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem ( position )?. let Ġ{ Ġholder . bind ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder Ġas ĠLoading ViewHolder ). on Bind ( network State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getItem Count () Ġ+ Ġif Ġ( has Extra Row ()) Ġ 1 Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetValue ( position : ĠInt ) Ġ= ĠgetItem ( position ) ĊĊĠĠĠ Ġfun Ġset Network State ( new Network State : ĠNetwork State ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious State Ġ= Ġthis . network State ĊĠĠĠĠĠĠĠ Ġval Ġhad Extra Row Ġ= Ġhas Extra Row () ĊĠĠĠĠĠĠĠ Ġthis . network State Ġ= Ġnew Network State ĊĠĠĠĠĠĠĠ Ġval Ġhas Extra Row Ġ= Ġhas Extra Row () ĊĠĠĠĠĠĠĠ Ġif Ġ( had Extra Row Ġ!= Ġhas Extra Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( had Extra Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Removed ( super . getItem Count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Inserted ( super . getItem Count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( has Extra Row Ġ&& Ġprevious State Ġ!= Ġnew Network State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( item Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTENT _ VIEW _ TYPE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFO OTER _ VIEW _ TYPE Ġ= Ġ 2 ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠCurrent State Ġ{ ĊĠĠĠ ĠDONE , ĠLO ADING , ĠERROR Ċ }