package Ġcom . challenge . ve get able discovery . ui . ve get able list Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . Linear Snap Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġcom . challenge . ve get able discovery . R Ċ import Ġcom . challenge . ve get able discovery . databinding . Fragment Ve get able List Binding Ċ import Ġcom . challenge . ve get able discovery . extension . safe Navigate Ċ import Ġcom . challenge . ve get able discovery . ui . vit amin filter . V it amin Filter ListAdapter Ċ import Ġcom . challenge . ve get able discovery . ui . vit amin filter . V it amin Filter ViewModel Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel Ċ Ċ class ĠVe get able List Fragment Ġ: ĠFragment (), ĠVe get able ListAdapter . Listener , ĠSw ipe Refresh Layout . On Refresh Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġve get able List ViewModel : ĠVe get able List ViewModel Ġby ĠviewModel < Ve get able List ViewModel >() ĊĠĠĠ Ġprivate Ġval Ġvit amin Filter ViewModel : ĠV it amin Filter ViewModel Ġby ĠviewModel < V it amin Filter ViewModel >() ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Ve get able List Binding ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠThis Ġproperty Ġis Ġonly Ġvalid Ġbetween ĠonCreate View Ġand Ġon Destroy View . ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Ve get able List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġsetup Ve get able RecyclerView () ĊĠĠĠĠĠĠĠ Ġsetup V it amin Filter RecyclerView () ĊĠĠĠĠĠĠĠ Ġsetup Status View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Status View () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġshow Ġa Ġsn ackbar Ġwhen Ġthere Ġis Ġan Ġissue Ġe . g . Ġno Ġinternet Ġconnection ĊĠĠĠĠĠĠĠ Ġve get able List ViewModel . issue Message . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . getContent IfNot Handled ()?. let Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . constraint Layout , Ġmessage , ĠSn ackbar . LENGTH _ IN DEFIN ITE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Action ( R . string . ok ) Ġ{ Ġdismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Max Inline Action Width ( 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbind Ġpull Ġrefresh Ġevent Ġto Ġfetch Ġdata Ġfrom Ġnetwork ĊĠĠĠĠĠĠĠ Ġbinding . swipe Container . setOn Refresh Listener ( this ) ĊĠĠĠĠĠĠĠ Ġve get able List ViewModel . is Refresh ing . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . swipe Container . is Refresh ing Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġobserve Ġto Ġshow Ġno Ġresult ĊĠĠĠĠĠĠĠ Ġve get able List ViewModel . ve get ables . observe ( view Lifecycle Owner , Ġ{ Ġve get ables Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . empty Ve get able Information . isVisible Ġ= Ġve get ables . isEmpty () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġve get able List ViewModel . refresh Ve get able Cache () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Ve get able Item Click ( ve get able Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= ĠVe get able List Fragment Directions . action Navigation Discovery To Navigation Ve get able Detail ( ve get able Id ) ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). safe Navigate ( direction ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Ve get able RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠVe get able ListAdapter ( this ) ĊĊĠĠĠĠĠĠĠ Ġbinding . ve get able List . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠGrid LayoutManager ( this . context , Ġresources . getInteger ( R . integer . grid _ size )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Adapter ( adapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġve get able List ViewModel . ve get ables . observe ( view Lifecycle Owner , Ġ{ Ġve get ables Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . ve get able List . isVisible Ġ= Ġve get ables . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( ve get ables ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup V it amin Filter RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠV it amin Filter ListAdapter ( vit amin Filter ViewModel . vit amin Filters ) ĊĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( this . context , ĠRecyclerView . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . vit amin Filter . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Adapter ( adapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġbind Ġa Ġvit amin Ġfilter Ġto Ġfilter Ġve get able Ġresult ĊĠĠĠĠĠĠĠ Ġval Ġsnap Helper Ġ= ĠLinear Snap Helper () ĊĠĠĠĠĠĠĠ Ġsnap Helper . attach To RecyclerView ( binding . vit amin Filter ) ĊĠĠĠĠĠĠĠ Ġbinding . vit amin Filter . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠRecyclerView . SCROLL _ STATE _ IDLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Helper . find Snap View ( linear LayoutManager )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġlinear LayoutManager . getPosition ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= ĠRecyclerView . NO _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnap V it amin Ġ= Ġvit amin Filter ViewModel . vit amin Filters [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snap V it amin Ġ!= Ġve get able List ViewModel . selected Filter . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġve get able List ViewModel . setSelected Filter ( snap V it amin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġbinding . vit amin Filter . clear On Scroll Listeners () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }