package Ġkr . co . pl astic city . n emo . demo Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkr . co . pl astic city . n emo . demo . databinding .* Ċ import Ġkr . co . pl astic city . n emo . widget . N emo RecyclerView Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ċ { Ċ ĉ val Ġcolors Ġ= ĠlistOf ( Ċĉĉ ĉ "# EF 9 A 9 A ", Ċĉĉ ĉ "# F 5 B 7 B 1 ", Ċĉĉ ĉ "# C 3 9 BD 3 ", Ċĉĉ ĉ "# 7 FB 3 D 5 ", Ċĉĉ ĉ "# F 9 E 7 9 F ", Ċĉĉ ĉ "# 7 D CE A 0 ", Ċĉĉ ĉ "# F 8 C 4 7 1 ", Ċĉĉ ĉ "# F 0 B 2 7 A ", Ċĉĉ ĉ "# ED BB 9 9 ", Ċĉĉ ĉ "# F 7 F 9 F 9 ", Ċĉĉ ĉ "# D 5 DB DB ", Ċĉĉ ĉ "# ABB 2 B 9 ", Ċĉĉ ĉ "# B 2 B ABB ", Ċĉĉ ĉ "# 8 5 C 1 E 9 ", Ċĉĉ ĉ "# BB 8 F CE ", Ċĉĉ ĉ "# A 9 DF BF ", Ċĉĉ ĉ "# FA E 5 D 3 ", Ċĉĉ ĉ "# F 1 C 4 0 F ", Ċĉĉ ĉ "# 4 FC 3 F 7 ", Ċĉĉ ĉ "# A ED 5 8 1 " Ċ ĉ ) ĊĉĊ ĉ override Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ċ ĉ { Ċĉ ĉ val Ġheader Ġ= ĠN emo RecyclerView . model ( Header (" N emo RecyclerView Ġë į° ëª¨ ", Ġ" ì ī ½ ê³ł Ġë¹ ł ë¥¸ Ġë© Ģ íĭ° ĠíĥĢ ìŀħ Ġë¦¬ ìĤ¬ ìĿ´ íģ ´ë Ł ¬ ë · ° Ġë§Įëĵ¤ ê¸° ! ")) Ġ{ Ġtitle Ġ} Ċĉ ĉ val Ġlist Header Ġ= ĠN emo RecyclerView . model ( Item Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ 0 ")) Ċĉ ĉ val Ġlist Ġ= ĠN emo RecyclerView . model < Item >( mutable ListOf ()) Ġ{ Ġkey Ġ} ĊĉĉĊĉ ĉ super . onCreate ( savedInstanceState ) Ċĉ ĉ Activity Main Binding . inflate ( layout Inflater ). also Ġ{ Ġbinding Ġ-> Ċĉĉ ĉ set ContentView ( binding . root ) Ċĉĉ ĉ re cyclerView Ġ{ Ċĉĉĉ ĉ single ( model Ġ= Ġheader , Ġview Ġ= ĠItem Header Binding :: inflate ) Ġ{ Ċĉĉĉĉ ĉ bind Ġ{ Ġdata , Ġbinding Ġ-> Ċĉĉĉĉĉ ĉ binding . title . text Ġ= Ġdata . title Ċĉĉĉĉĉ ĉ binding . content . text Ġ= Ġdata . content Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ divider Ġ{ Ċĉĉĉĉĉ ĉ size Dp Ġ= Ġ 2 . 0 f Ċĉĉĉĉĉ ĉ color Ġ= Ġ"# FF 8 0 8 0 8 0 " Ċĉĉĉĉĉ ĉ show Ġ= Ġ{ ĠEND Ġ} Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ single ( model Ġ= Ġlist Header , Ġview Ġ= ĠItem List Header Binding :: inflate ) Ġ{ Ċĉĉĉĉ ĉ val Ġmax Index Ġ= Ġ 1 0 0 Ċĉĉĉĉ ĉ bind Ġ{ Ġdata , Ġbinding Ġ-> Ċĉĉĉĉĉ ĉ binding . text . text Ġ= Ġdata . text Ċĉĉĉĉĉ ĉ binding . gen Button . setOnClickListener Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnew List Ġ= Ġmutable ListOf < Item >() Ċĉĉĉĉĉĉ ĉ for Ġ( i Ġin Ġ 0 .. max Index ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ if Ġ( Math . random () Ġ< Ġ 0 . 5 ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ new List . add ( Item ( i , Ġ( Math . random () Ġ* Ġ 2 0 ). toInt ())) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ list . update ( new List ) Ċĉĉĉĉĉĉ ĉ list Header . value Ġ= ĠItem Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ${ list . size }") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ binding . addItem Button . setOnClickListener Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnew Item Ġ= ĠItem (( Math . random () Ġ* Ġ( max Index Ġ+ Ġ 1 )). toInt (), Ġ( Math . random () Ġ* Ġ 2 0 ). toInt ()) Ċĉĉĉĉĉĉ ĉ list . indexOf First Ġ{ Ġit . key Ġ== Ġnew Item . key Ġ}. let Ġ{ Ċĉĉĉĉĉĉĉ ĉ if Ġ( it Ġ!= Ġ- 1 ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ list [ it ] Ġ= Ġnew Item Ċĉĉĉĉĉĉĉĉ ĉ null Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ else Ġit Ċĉĉĉĉĉĉ ĉ } ?. also Ġ{ Ċĉĉĉĉĉĉĉ ĉ list . indexOf First Ġ{ Ġit . key Ġ> Ġnew Item . key Ġ}. also Ġ{ Ċĉĉĉĉĉĉĉĉ ĉ if Ġ( it Ġ!= Ġ- 1 ) Ġlist . add ( it , Ġnew Item ) Ċĉĉĉĉĉĉĉĉ ĉ else Ġlist Ġ+= Ġnew Item Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ list Header . value Ġ= ĠItem Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ${ list . size }") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ binding . delete Item Button . setOnClickListener Ġ{ Ċĉĉĉĉĉĉ ĉ if Ġ( list . isEmpty ()) Ġreturn @ setOnClickListener Ċĉĉĉĉĉĉ ĉ val Ġindex Ġ= Ġ( Math . random () Ġ* Ġlist . size ). toInt () Ċĉĉĉĉĉĉ ĉ list . remove At ( index ) Ċĉĉĉĉĉĉ ĉ list Header . value Ġ= ĠItem Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ${ list . size }") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ binding . delete All Item Button . setOnClickListener Ġ{ Ċĉĉĉĉĉĉ ĉ list . clear () Ċĉĉĉĉĉĉ ĉ list Header . value Ġ= ĠItem Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ${ list . size }") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ binding . delete Multi Item Button . setOnClickListener Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnew List Ġ= Ġmutable ListOf < Item >() Ċĉĉĉĉĉĉ ĉ for Ġ( i Ġin Ġlist . indices ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ if Ġ( Math . random () Ġ< Ġ 0 . 5 ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ new List . add ( list [ i ]) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ list . removeAll ( new List ) Ċĉĉĉĉĉĉ ĉ list Header . value Ġ= ĠItem Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ${ list . size }") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ binding . retain Multi Item Button . setOnClickListener Ġ{ Ċĉĉĉĉĉĉ ĉ val Ġnew List Ġ= Ġmutable ListOf < Item >() Ċĉĉĉĉĉĉ ĉ for Ġ( i Ġin Ġlist . indices ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ if Ġ( Math . random () Ġ< Ġ 0 . 5 ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ new List . add ( list [ i ]) Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ list . retain All ( new List ) Ċĉĉĉĉĉĉ ĉ list Header . value Ġ= ĠItem Header (" ìķĦ ìĿ´ íħľ Ġê° ¯ ìĪĺ : Ġ${ list . size }") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ multi ( model Ġ= Ġlist , Ġview Ġ= ĠItem List Binding :: inflate ) Ġ{ Ċĉĉĉĉ ĉ placeholder ( ItemList Placeholder Binding :: inflate ) Ċĉĉĉĉ ĉ bind Ġ{ Ġdata , Ġbinding Ġ-> Ċĉĉĉĉĉ ĉ binding . root . set BackgroundColor ( Color . parse Color ( colors [ data . color ])) Ċĉĉĉĉĉ ĉ binding . text . text Ġ= Ġ"${ data . key }" Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ divider Ġ{ Ċĉĉĉĉĉ ĉ size Dp Ġ= Ġ 2 . 0 f Ċĉĉĉĉĉ ĉ color Ġ= Ġ"# FF 8 0 8 0 8 0 " Ċĉĉĉĉĉ ĉ show Ġ= Ġ{ ĠBEGIN NING Ġand ĠEND Ġand ĠINCLUDE _ PLACE HOLDER Ġand ĠK EE P _ ALPHA Ġand ĠK EE P _ POSITION Ġ} Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ single ( Item Footer Binding :: inflate ) Ġ{ Ċĉĉĉĉ ĉ /* Ġempty Ġ*/ Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } Ċ } Ċ Ċ private Ġdata Ġclass ĠHeader ( val Ġtitle : ĠString , Ġval Ġcontent : ĠString ) Ċ private Ġdata Ġclass ĠItem Header ( val Ġtext : ĠString ) Ċ private Ġdata Ġclass ĠItem ( val Ġkey : ĠInt , Ġval Ġcolor : ĠInt ) Ċ