package Ġcom . y ous fi . hay ati ine App . ui . material Vertical Step per Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ Ċ import Ġcom . y ous fi . hay ati ine App . R Ċ import Ġcom . y ous fi . hay ati ine App . databinding . Step per Item Binding Ċ Ċ class ĠVertical Step per Adapter ( ĊĠĠĠ Ġprivate Ġval Ġfragment Manager : ĠFragment Manager , ĊĠĠĠ Ġval Ġcontext : ĠContext Ċ ) Ġ: ĠList Adapter < Vertical Item , ĠVertical Step per Adapter . Step per ViewHolder >( ĊĠĠĠ ĠTest Diff Callback () Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġactive Drawable : Drawable Ġ= ĠDrawable Compat . wrap ( Context Compat . get Drawable ( context , ĠR . drawable . circle _ bg ) !! ) ĊĠĠĠ Ġprivate Ġvar Ġin Active Drawable : Drawable Ġ= ĠDrawable Compat . wrap ( Context Compat . get Drawable ( context , ĠR . drawable . circle _ bg ) !! ); ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( active Drawable , ĠContext Compat . getColor ( context , Ġactive Color )) ĊĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( in Active Drawable , ĠContext Compat . getColor ( context , Ġin Active Color )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġlast Clicked Item Position Ġ= Ġ- 1 ĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠStep per ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠ Ġval Ġbinding : ĠStep per Item Binding Ġ= ĠStep per Item Binding . inflate ( in flater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠStep per ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠStep per ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠ Ġholder . binding . item Ġ= Ġitem ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Fragment To View ( holder , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Fragment To View ( holder , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item . isActive ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . circle Image . background Ġ= Ġactive Drawable ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . circle Image . background Ġ= Ġin Active Drawable ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ>= Ġitem Count Ġ- Ġ 1 ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Next . text Ġ= Ġfinish Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . fragment . finish Button Action () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Next . text Ġ= Ġnext Text ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . fragment . check Fields Validation ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ< Ġitem Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . is Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Item Ġ= ĠgetItem ( position Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Item . isOpen Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Item . isActive Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . isOpen Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Clicked Item Position Ġ= Ġposition Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġholder . binding . btn Prev . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Item Ġ= ĠgetItem ( position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Item . isOpen Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . isOpen Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Clicked Item Position Ġ= Ġposition Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġholder . binding . circle Image . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . isActive ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem . isOpen Ġ= Ġ! item . isOpen ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Clicked Item Position Ġ!= Ġ- 1 Ġ&& ĠgetItem ( last Clicked Item Position ). isOpen Ġ&& Ġlast Clicked Item Position Ġ!= Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetItem ( last Clicked Item Position ). isOpen Ġ= Ġ! getItem ( last Clicked Item Position ). isOpen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( last Clicked Item Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Clicked Item Position Ġ= Ġposition ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck View Visibility ( item , Ġholder , Ġposition ) ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck View Visibility ( ĊĠĠĠĠĠĠĠ Ġitem : ĠVertical Item , ĊĠĠĠĠĠĠĠ Ġholder : ĠStep per ViewHolder , ĊĠĠĠĠĠĠĠ Ġposition : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . content Fragment . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . content Fragment . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item . isOpen ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Prev . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Prev . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Next . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . content Fragment . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Next . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . btn Prev . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . content Fragment . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġitem Count Ġ- Ġ 1 Ġ|| Ġitem . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . vertical Line . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . vertical Line . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( position == 2 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . binding . vertical Line . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Fragment To View ( holder : ĠStep per ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Old Fragment ( holder ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Container Id : ĠInt Ġ= Ġposition Ġ+ Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġholder . binding . content Fragment . id Ġ= Ġnew Container Id Ġ// ĠSet Ġcontainer Ġid ĊĊĠĠĠĠĠĠĠ Ġfragment Manager . beginTransaction (). replace ( new Container Id , ĠgetItem ( position ). fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Old Fragment ( holder : ĠStep per ViewHolder ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Id : ĠInt Ġ= Ġholder . binding . content Fragment . id Ġ// ĠGet Ġcontainer Ġid ĊĠĠĠĠĠĠĠ Ġval Ġold Fragment : ĠFragment ? Ġ= Ġfragment Manager . find Fragment ById ( container Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager . beginTransaction (). remove ( old Fragment ). commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠStep per ViewHolder ( var Ġbinding : ĠStep per Item Binding ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ){ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Next . text Ġ= Ġnext Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Prev . text Ġ= Ġprev Text ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } ĊĊ Ċ class ĠTest Diff Callback Ġ: ĠDiff Util . Item Callback < Vertical Item >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠVertical Item , Ġnew Item : ĠVertical Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠVertical Item , Ġnew Item : ĠVertical Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠ Ġ} Ċ Ċ }