package Ġcom . memory a . presentation . ad p ater Ċ Ċ 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 . memory a . databinding . Vocab ulary Header Binding Ċ import Ġcom . memory a . databinding . Vocab ulary Item Binding Ċ import Ġcom . memory a . framework . room . entities . Vocab ulary Item Entity Ċ Ċ private Ġconst Ġval ĠITEM _ VIEW _ TYPE _ HEADER Ġ= Ġ 0 Ċ private Ġconst Ġval ĠITEM _ VIEW _ TYPE _ ITEM Ġ= Ġ 1 Ċ Ċ class ĠV ocab ulary Item Adapter ( ĊĠĠĠ Ġprivate Ġval Ġ_ on Long ClickListener : ĠOn Long ClickListener Ċ ) Ġ: ĠList Adapter < Data Item , ĠRecyclerView . ViewHolder >( Vocab ulary Item Diff Callback ()) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ VIEW _ TYPE _ HEADER Ġ-> ĠHeader ViewHolder . from ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠITEM _ VIEW _ TYPE _ ITEM Ġ-> ĠV ocab ulary Item ViewHolder . from ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠClass CastException (" Unknown Ġview Type Ġ$ view Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Header And Submit List ( list : ĠList < Vocab ulary Item Entity > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġwhen Ġ( list ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠlistOf ( Data Item . Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠlistOf ( Data Item . Header ) Ġ+ Ġlist . map Ġ{ ĠData Item . En Vocab ulary Item ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsubmit List ( items ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠV ocab ulary Item ViewHolder Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠgetItem ( position ) Ġas ĠData Item . En Vocab ulary Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( item . vocabulary Item Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ on Long ClickListener . on Long Click ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( getItem ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠData Item . Header Ġ-> ĠITEM _ VIEW _ TYPE _ HEADER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠData Item . En Vocab ulary Item Ġ-> ĠITEM _ VIEW _ TYPE _ ITEM ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠV ocab ulary Item ViewHolder Ġprivate Ġconstructor ( private Ġval Ġ_ binding : ĠV ocab ulary Item Binding ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder (_ binding . root ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup ): ĠV ocab ulary Item ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Inflater Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠV ocab ulary Item Binding . inflate ( layout Inflater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠV ocab ulary Item ViewHolder ( binding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar ĠitemId : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( item Entity : ĠV ocab ulary Item Entity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemId Ġ= Ġitem Entity . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ binding . vocabulary Item Ġ= Ġitem Entity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ binding . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠOn Long ClickListener ( val Ġlong ClickListener : Ġ( item : ĠData Item . En Vocab ulary Item ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Long Click ( item : ĠData Item . En Vocab ulary Item ) Ġ= Ġlong ClickListener ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠV ocab ulary Item Diff Callback Ġ: ĠDiff Util . Item Callback < Data Item >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠData Item , Ġnew Item : ĠData Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item . id Ġ== Ġnew Item . id ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠData Item , Ġnew Item : ĠData Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠHeader ViewHolder Ġprivate Ġconstructor (_ binding : ĠV ocab ulary Header Binding ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder (_ binding . root ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup ): ĠHeader ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Inflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠV ocab ulary Header Binding . inflate ( layout Inflater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHeader ViewHolder ( binding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠData Item Ġ{ ĊĠĠĠ Ġabstract Ġval Ġid : ĠInt ĊĊĠĠĠ Ġdata Ġclass ĠEn Vocab ulary Item ( val Ġvocabulary Item Entity : ĠV ocab ulary Item Entity ) Ġ: ĠData Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid Ġ= Ġvocabulary Item Entity . id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠHeader Ġ: ĠData Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġid Ġ= ĠInt . MIN _ VALUE ĊĠĠĠ Ġ} Ċ } ĊĊ