package Ġworld . ach ie ver . pl any our day . plan Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġworld . ach ie ver . pl any our day . data . source . local . Task Ċ import Ġworld . ach ie ver . pl any our day . databinding . Item Re cy cer View Plan Binding Ċ import Ġworld . ach ie ver . pl any our day . plan . Plan Tasks Adapter . ViewHolder Ċ import Ġworld . ach ie ver . pl any our day . util . smooth Scroll To Bottom Item ĊĊ Ċ class ĠPlan Tasks Adapter ( ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠPlan ViewModel , ĊĠĠĠ Ġprivate Ġval Ġre cyclerView : ĠRecyclerView Ċ ) Ġ: ĠList Adapter < Task , ĠViewHolder >( Task Diff Callback ()) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠItem Touch Helper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Simple Item Touch Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon RecyclerView Item Move Ġ= Ġ{ ĠstartPosition , Ġend Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on RecyclerView Item Move ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartPosition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon RecyclerView Item Sw ip ed Ġ= Ġ{ Ġitem Position , Ġdirection Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on RecyclerView Item Sw ip ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon RecyclerView Clear View Ġ= Ġ{ ĠviewModel . on RecyclerView Clear View () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). attach To RecyclerView ( re cyclerView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠ Ġholder . bind ( viewModel , Ġitem ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder . from ( parent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Current List Changed ( ĊĠĠĠĠĠĠĠ Ġprevious List : ĠMutable List < Task >, ĊĠĠĠĠĠĠĠ Ġcurrent List : ĠMutable List < Task > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Current List Changed ( previous List , Ġcurrent List ) ĊĠĠĠĠĠĠĠ Ġif Ġ( previous List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Item HasBeen Added Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent List . size Ġ== Ġprevious List . size Ġ+ Ġ 1 Ġ&& Ġcurrent List . last (). id Ġ!= Ġprevious List . last (). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Item HasBeen Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . smooth Scroll To Bottom Item () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠViewHolder Ġprivate Ġconstructor ( private Ġval Ġbinding : ĠItem Re cy cer View Plan Binding ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( viewModel : ĠPlan ViewModel , Ġitem : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . task Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Inflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠItem Re cy cer View Plan Binding . inflate ( layout Inflater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( binding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTask Diff Callback Ġ: ĠDiff Util . Item Callback < Task >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠTask , Ġnew Item : ĠTask ) Ġ= Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠTask , Ġnew Item : ĠTask ) Ġ= Ġold Item Ġ== Ġnew Item Ċ }