package Ġcom . m re ig osa . mar vel app . presentation . features . character list Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . view . do On Pre Draw Ċ import Ġandroidx . core . view . is G one Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . fragment . Fragment Navigator Extras Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . android . material . transition . Material Elevation Scale Ċ import Ġcom . m re ig osa . mar vel app . domain . model . Mar vel Character Ċ import Ġcom . m re ig osa . mar vel app . presentation . R Ċ import Ġcom . m re ig osa . mar vel app . presentation . databinding . Fragment Mar vel Character List Binding Ċ import Ġcom . m re ig osa . mar vel app . presentation . util . End less Scroll Listener Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel Ċ Ċ class ĠMar vel Character List Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMar vel Character List ViewModel Ġby ĠviewModel () ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Mar vel Character List Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġprivate Ġval Ġcharacters Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMar vel Character Adapter ( listener Ġ= Ġ:: on Character Selected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġend less Scroll Listener Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠEnd less Scroll Listener Ġ{ Ġtotal Items Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Adapter . show Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . fetch Characters ( total Items ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Mar vel Character 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 ) ĊĠĠĠĠĠĠĠ Ġpost p one Enter Transition () ĊĠĠĠĠĠĠĠ Ġbinding . character List . do On Pre Draw Ġ{ Ġstart Post p oned Enter Transition () Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠĠĠĠĠ Ġinit Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . character List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcharacters Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠGrid LayoutManager ( context , Ġ 2 ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . span Size Lookup Ġ= Ġcharacters Adapter . span Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( end less Scroll Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . view State . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter ListView State . First Loading Ġ-> Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter ListView State . Error Ġ-> Ġshow Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCharacter ListView State . Character List Loaded Ġ-> Ġon Characters Loaded ( it . characters ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCharacter ListView State . Empty Characters Loaded Ġ-> Ġshow Empty View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . progress Bar . isVisible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . progress Bar . is G one Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Characters Loaded ( characters : ĠList < Mar vel Character >) Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠ Ġbinding . empty Data View . is G one Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġend less Scroll Listener . set Loaded () ĊĠĠĠĠĠĠĠ Ġcharacters Adapter . set Items ( characters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠ Ġshow Sn ackBar ( getString ( R . string . something _ w ent _ wrong )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Empty View (){ ĊĠĠĠĠĠĠĠ Ġbinding . empty Data View . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Character Selected ( character : ĠMar vel Character , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexit Transition Ġ= ĠMaterial Elevation Scale ( false ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 2 0 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre enter Transition Ġ= ĠMaterial Elevation Scale ( true ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 2 0 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMar vel Character List Fragment Directions . action To Character Detail ( character ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFragment Navigator Extras ( view Ġto Ġcharacter . image ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Sn ackBar ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . root , Ġtext , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} Ċ }