package Ġro . dob re sc u and rei . mv vm . list Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ import Ġcom . mig uel cat alan . material search view . Material Search View Ċ import Ġorg . green robot . event bus . Subscribe Ċ import Ġro . andre id ob re sc u . decl arative adapter kt . Base Decl arative Adapter Ċ import Ġro . andre id ob re sc u . decl arative adapter kt . view . Header View Ċ import Ġro . dob re sc u and rei . mv vm . Base Fragment Ċ import Ġro . dob re sc u and rei . mv vm . R Ċ import Ġro . dob re sc u and rei . mv vm . list . item _ decoration . FAB Divider Item Decoration Ċ import Ġro . dob re sc u and rei . mv vm . list . item _ decoration . Sticky Headers Item Decoration Ċ import Ġro . dob re sc u and rei . mv vm . utils . On Keyboard Closed Event Ċ import Ġro . dob re sc u and rei . mv vm . utils . On Keyboard Opened Event Ċ Ċ abstract Ġclass ĠBase List Fragment < VIEW _ MODEL Ġ: ĠBase List ViewModel <* >, ĠAD AP TER Ġ: ĠBase Decl arative Adapter > Ġ: ĠBase Fragment < VIEW _ MODEL >() Ċ { ĊĠĠĠ Ġlateinit Ġvar Ġre cyclerView Ġ: ĠRecyclerView Mod ĊĠĠĠ Ġlateinit Ġvar Ġempty View Ġ: ĠTextView ĊĠĠĠ Ġvar Ġadd Button Ġ: ĠFloating ActionButton ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġsticky Headers Item Decoration Ġ: ĠSt icky Headers Item Decoration ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview = super . onCreate View ( in flater , Ġcontainer , ĠsavedInstanceState ) !! ĊĊĠĠĠĠĠĠĠ Ġre cyclerView = view . findViewById ( R . id . re cyclerView ) ĊĠĠĠĠĠĠĠ Ġempty View = view . findViewById ( R . id . empty View ) ĊĠĠĠĠĠĠĠ Ġadd Button = view . findViewById ( R . id . add Button ) ĊĊĠĠĠĠĠĠĠ Ġadd Button ?. setOnClickListener Ġ{ Ġon Add Button Clicked () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsearch View ?. setOn Query Text Listener ( object Ġ: ĠMaterial Search View . On Query Text Listener ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( query )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . search = query !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Data () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch View ?. close Search () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager = provide LayoutManager () ĊĊĠĠĠĠĠĠĠ Ġval Ġadapter = provide Adapter () ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter = adapter ĊĊĠĠĠĠĠĠĠ Ġval Ġdecoration = provide Item Decoration () ĊĠĠĠĠĠĠĠ Ġif Ġ( decoration != null ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( decoration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Sticky Headers ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsticky Headers Item Decoration = Sticky Headers Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* header View Instanti ator */ Ġ Ġ{ Ġprovide Sticky Header View ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* header Model Class Provider */ { Ġprovide Sticky Header Model Class ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( sticky Headers Item Decoration !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( should Load More On Scroll ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . load More Data Action ={ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load More Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġempty View . text Ġ= Ġprovide Empty View Text () ĊĊĠĠĠĠĠĠĠ ĠviewModel . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Page Items . value = null ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Items . value = null ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty . value = false ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Page Items . observe ( this @ Base List Fragment ) Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items != null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. set Items ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Items . observe ( this @ Base List Fragment ) Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items != null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter ?. add Items ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠisEmpty . observe ( this @ Base List Fragment ) Ġ{ ĠisEmpty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty View . visibility = View . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . visibility = View . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty View . visibility = View . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . visibility = View . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . load Data () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġprovide Adapter () Ġ: ĠAD AP TER ĊĠĠĠ Ġopen Ġfun Ġprovide LayoutManager () Ġ: ĠRecyclerView . LayoutManager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠ Ġopen Ġfun Ġprovide Item Decoration () Ġ: ĠRecyclerView . Item Decoration ? Ġ= ĠF AB Divider Item Decoration ( context ) ĊĠĠĠ Ġopen Ġfun Ġshould Load More On Scroll () Ġ: ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġopen Ġfun Ġprovide Empty View Text (): ĠString Ġ= ĠgetString ( R . string . no _ items ) ĊĠĠĠ Ġopen Ġfun Ġhas Sticky Headers () Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġopen Ġfun Ġprovide Sticky Header Model Class ( position Ġ: ĠInt ) Ġ: ĠClass < *> ? Ġ= Ġnull ĊĠĠĠ Ġopen Ġfun Ġprovide Sticky Header View ( position Ġ: ĠInt ) Ġ: ĠHeader View < *> ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġshould Finish Activity On Back Pressed () Ġ: ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . search Mode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . search = null ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e Ġ: ĠException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġsticky Headers Item Decoration ?. on Destroy () ĊĠĠĠĠĠĠĠ Ġsticky Headers Item Decoration = null ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġoverride Ġfun Ġon Keyboard Opened ( event Ġ: ĠOn Keyboard Opened Event ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Button ?. visibility = View . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġoverride Ġfun Ġon Keyboard Closed ( event Ġ: ĠOn Keyboard Closed Event ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Button ?. visibility = View . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Add Button Clicked () ĊĠĠĠ Ġ{ ĊĠĠĠ Ġ} Ċ } Ċ