package Ġcom . example . android . polit ical prepared ness . election . adapter Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . example . android . polit ical prepared ness . databinding . E lection Item Binding Ċ import Ġcom . example . android . polit ical prepared ness . data . models . E lection Ċ import Ġcom . example . android . polit ical prepared ness . databinding . Header Binding Ċ import Ġcom . example . android . polit ical prepared ness . election . E lection s ViewModel Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context ĊĊ Ċ private Ġconst Ġval ĠITEM _ VIEW _ TYPE _ HEADER Ġ= Ġ 0 Ċ private Ġconst Ġval ĠITEM _ VIEW _ TYPE _ ITEM Ġ= Ġ 1 Ċ Ċ class ĠE lection ListAdapter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠviewModel : ĠE lection s ViewModel Ċ ) Ġ: ĠList Adapter < E lection Data Item , ĠRecyclerView . ViewHolder >( E lection Diff Callback ()) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġadapter Scope Ġ= ĠCor outine Scope ( Dispatch ers . Default ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ VIEW _ TYPE _ HEADER Ġ-> ĠHeader . from ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ VIEW _ TYPE _ ITEM Ġ-> ĠE lection ViewHolder . from ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠClass CastException (" Unknown Ġview Type Ġ$ view Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lection ViewHolder Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelection Item Ġ= ĠgetItem ( position ) Ġas ĠE lection Data Item . E lection Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( viewModel , Ġelection Item . election ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHeader Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Item Ġ= ĠgetItem ( position ) Ġas ĠE lection Data Item . Header ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( header Item . header Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( getItem ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lection Data Item . Header Ġ-> ĠITEM _ VIEW _ TYPE _ HEADER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lection Data Item . E lection Item Ġ-> ĠITEM _ VIEW _ TYPE _ ITEM ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubmit My List ( list : ĠList < E lection > ?, Ġheader Text : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġif Ġ( null Ġ!= Ġheader Text ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( E lection Data Item . Header ( header Text )) Ġ+ Ġlist . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE lection Data Item . E lection Item ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . map Ġ{ ĠE lection Data Item . E lection Item ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit List ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠE lection ViewHolder ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbinding : ĠE lection Item Binding ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĊĠĠĠ Ġfun Ġbind ( view Mode : ĠE lection s ViewModel , Ġitem : ĠE lection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= Ġview Mode ĊĠĠĠĠĠĠĠ Ġbinding . election Ġ= Ġitem ĊĊĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup ): ĠE lection ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠE lection Item Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠE lection ViewHolder ( binding ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHeader Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbinding : ĠHeader Binding ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĊĠĠĠ Ġfun Ġbind ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . header Text Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup ): ĠHeader Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠHeader Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHeader ( binding ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠE lection Diff Callback Ġ: ĠDiff Util . Item Callback < E lection Data Item >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item : ĠE lection Data Item , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Item : ĠE lection Data Item ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Item : ĠE lection Data Item , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Item : ĠE lection Data Item ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠE lection Data Item Ġ{ ĊĠĠĠ Ġdata Ġclass ĠE lection Item ( val Ġelection : ĠE lection ) Ġ: ĠE lection Data Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid Ġ= Ġelection . id . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠHeader ( val Ġheader Text : ĠString ) Ġ: ĠE lection Data Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid Ġ= ĠLong . MAX _ VALUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġval Ġid : ĠLong Ċ } Ċ