package Ġcom . contoso . nested scroll ing parent . view holder Ċ Ċ import Ġandroid . view . View Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . view pager . widget . Pager Adapter Ċ import Ġandroidx . view pager . widget . ViewPager Ċ import Ġcom . contoso . nested scroll ing parent . R Ċ import Ġcom . contoso . nested scroll ing parent . Sub Pager Adapter Ċ import Ġcom . contoso . nested scroll ing parent . common . Base ViewHolder Ċ import Ġcom . contoso . nested scroll ing parent . common . Holder Ċ import Ġcom . contoso . nested scroll ing parent . model . Nested ViewModel Ċ import Ġcom . contoso . nested scroll ing parent . model . Page VO Ċ import Ġcom . google . android . material . tabs . Tab Layout Ċ Ċ @ Holder ( layout Id Ġ= ĠR . layout . item _ pager ) Ċ class ĠP ager ViewHolder ( item View : ĠView ) Ġ: ĠBase ViewHolder < List < Page VO >>( item View ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Pager : ĠView Pager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtab Layout : ĠTab Layout ĊĠĠĠ Ġprivate Ġvar Ġpager Adapter : ĠP ager Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmodels : ĠList < Page VO >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠviewModel : ĠNested ViewModel ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġobserver Ġ= ĠObserver < Int ?> Ġ{ Ġheight Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( height Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . layout Params . height Ġ= Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . request Layout () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Pager Ġ= ĠitemView . findViewById ( R . id . view pager ) ĊĠĠĠĠĠĠĠ Ġtab Layout Ġ= ĠitemView . findViewById ( R . id . tab layout ) ĊĠĠĠĠĠĠĠ Ġtab Layout . setup With ViewPager ( view Pager , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġview Pager . add On Attach State ChangeListener ( object Ġ: ĠView . On Attach State ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Pager . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( v : ĠView ) Ġ= ĠUnit ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠitemView . add On Attach State ChangeListener ( object Ġ: ĠView . On Attach State ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ?. inner View Container ?. value Ġ= ĠitemView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ?. inner View Container ?. value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind View ( data : ĠList < Page VO >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( models Ġ=== Ġdata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmodels Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠitemView . context ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠFragment Activity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpager Adapter Ġ= ĠSub Pager Adapter ( context . support FragmentManager , Ġmodels !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Pager . adapter Ġ= Ġpager Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpager Adapter !!. notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( context ). get ( Nested ViewModel :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. pager Height . remove Observer ( observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel !!. pager Height . observe ( context , Ġobserver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpager Height Ġ= ĠviewModel !!. pager Height . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pager Height Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . layout Params . height Ġ= Ġpager Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ