package Ġcom . cr az yle g end . recyclerview Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Sparse Boolean Array Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . CheckBox Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby ĠH rist ij an Ġon Ġ 2 / 1 / 1 9 Ġto Ġlong Ġlive Ġand Ġpro sper Ġ! Ċ Ġ*/ Ċ Ċ class ĠRecyclerView Utils Ġ{ ĊĊĠĠĠ Ġvar Ġselected Position Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġval Ġselected Items Ġ= ĠSparse Boolean Array () ĊĊĠĠĠ Ġfun Ġget Selected Items Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselected Items . size () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Selected Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Items . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Selected Items (): ĠSparse Boolean Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselected Items ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Horizontal Divider ( context : ĠContext , Ġre cyclerView : ĠRecyclerView , Ġlayout Manager : ĠLinearLayoutManager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdivider Item Decoration Ġ= ĠDiv ider Item Decoration ( context , Ġlayout Manager . orientation ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . addItem Decoration ( divider Item Decoration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġremove Selected Items ( list : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġselected Items . size () Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Items ( list , Ġadapter , Ġget Selected Items Positions ()[ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear Selected ( adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Selected Items Positions (): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist : ĠArrayList < Int > Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġselected Items . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( selected Items . key At ( i )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġdelete Items ( list : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . remove At ( position ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Removed ( position ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( position , Ġadapter . item Count ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġclear Selected ( adapter : ĠRecyclerView . Adapter <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( selected Items . key At ( 0 ), Ġadapter . item Count ) ĊĠĠĠĠĠĠĠ Ġselected Items . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear All Selected On Recycler ( adapter : ĠRecyclerView . Adapter <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( selected Items . key At ( 0 ), Ġadapter . item Count ) ĊĠĠĠĠĠĠĠ Ġselected Items . clear () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġselect Items On Checkbox ( checkBox : ĠCheckBox , Ġadapter Position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠcheckBox . isChecked Ġ= Ġselected Items . get ( adapter Position ) ĊĊĠĠĠĠĠĠĠ ĠcheckBox . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Items . get ( adapter Position , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Items . delete ( adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckBox . isChecked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Items . put ( adapter Position , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckBox . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput SelectedItem ( position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġselected Items . put ( position , Ġtrue ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove SelectedItem ( position : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġselected Items . delete ( position ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġinsert Item On Last Position ( adapter List : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >, Ġitem To Insert : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter List . add ( item To Insert ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Inserted ( adapter List . size Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġchange Item At Position ( adapter List : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >, Ġposition For Changing : ĠInt , Ġitem To Change : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter List [ position For Changing ] Ġ= Ġitem To Change ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( position For Changing ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġinsert Multiple Items ( adapter List : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >, Ġinsertion Starts At : ĠInt , Ġlist To Insert : ĠMutable List < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter List . addAll ( list To Insert ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( insertion Starts At , Ġlist To Insert . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġdelete Item ( adapter List : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >, Ġposition For Deletion : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġadapter List . remove At ( position For Deletion ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Removed ( position For Deletion ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( position For Deletion , Ġadapter . item Count ) ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġdelete Item With Undo ( adapter List : ĠMutable List < T >, Ġadapter : ĠRecyclerView . Adapter <* >, Ġposition For Deletion : ĠInt , Ġroot Layout : ĠView ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// implementation Ġ' com . google . android . material : material : 1 . 1 . 0 ' ĊĊĠĠĠĠĠĠĠ Ġval Ġdeleted Ġ= Ġadapter List . remove At ( position For Deletion ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Removed ( position For Deletion ) ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( position For Deletion , Ġadapter . item Count ) ĊĊĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( root Layout , Ġ" Item Ġremoved Ġ! ", ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction (" Undo ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter List . add ( position For Deletion , Ġdeleted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Inserted ( position For Deletion ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĊĠĠĠ Ġ} ĊĊ Ċ } Ċ