package Ġcom . dev . online _ todo _ list _ example . fragments . list Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ import Ġcom . dev . online _ todo _ list _ example . R Ċ import Ġcom . dev . online _ todo _ list _ example . data . models . ToDo Data Ċ import Ġcom . dev . online _ todo _ list _ example . data . view model . ToDo ViewModel Ċ import Ġcom . dev . online _ todo _ list _ example . databinding . Fragment List Binding Ċ import Ġcom . dev . online _ todo _ list _ example . fragments . Share ViewModel Ċ import Ġcom . dev . online _ todo _ list _ example . fragments . list . adapter . RV Adapter Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjp . was ab eef . recyclerview . anim ators . Landing Animator Ċ Ċ class ĠList Fragment Ġ: ĠFragment (), ĠSearch View . On Query Text Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment List Binding ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġcan Ġget Ġthe Ġbinding ĠLayout ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġ// Ġlazy Ġput Ġthe ĠR V Adapter Ġand ĠViewModel ĊĠĠĠ Ġprivate Ġval Ġrv Adapter Ġby Ġlazy Ġ{ ĠR V Adapter () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Share ViewModel : ĠShare ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġval Ġm ToDo ViewModel : ĠTo Do ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠData ĠBinding ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġlifecycle Owner Ġto Ġlet Ġthe ĠLive Data Ġobserve Ġdata Ġchange ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġ// ĠBind Ġlayout Ġvariable ĊĠĠĠĠĠĠĠ Ġbinding . m Share ViewModel Ġ= Ġm Share ViewModel ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup ĠR V ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBind ĠData Ġto ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġm ToDo ViewModel . getAll Data . observe ( view Lifecycle Owner , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Share ViewModel . check If Database Empty ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . setData ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet ĠMenu ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ================= ======= ĠRecyclerView Ġ================= ======= Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġbinding . re cyclerView ĊĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġrv Adapter ĊĠĠĠĠĠĠĠ Ġ// Ġre cyclerView . layout Manager Ġ= ĠLinearLayoutManager ( require Activity ()) ĊĠĠĠĠĠĠĠ Ġ// ĠChange Ġthe Ġdefault ĠLayout Ġof ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠSt agger ed Grid LayoutManager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSt agger ed Grid LayoutManager . VERTICAL ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ================= ======= ĠThird - party ĠExtension Ġ================= ======= Ġ*/ ĊĠĠĠĠĠĠĠ Ġ// ĠUse ĠRe cycler view - Anim ators ĊĠĠĠĠĠĠĠ Ġre cyclerView . item Animator Ġ= ĠLand ing Animator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Duration Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSw iper Ġto ĠDelete ĊĠĠĠĠĠĠĠ ĠsetUp RecyclerView Sw iper ToDelete ( re cyclerView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp RecyclerView Sw iper ToDelete ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsw iper Delete Item Callback Ġ= Ġobject Ġ: ĠSw iper ToDelete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġdirection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġthe Ġsw iper Ġitem , Ġuse ĠviewHolder . adapter Position Ġto Ġget Ġlocate Ġto Ġthe Ġcurrent - item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Item Ġ= Ġrv Adapter . data List [ view Holder . adapter Position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . delete Item ( delete Item ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInform Ġthe Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . notify Item Changed ( view Holder . adapter Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUndo Ġdelete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġundo Delete Item ( view Holder . item View , Ġdelete Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAttach Ġthe ĠHelper Ġwith ĠRe cycler view ĊĠĠĠĠĠĠĠ Ġval Ġitem Touch Helper Ġ= ĠItem Touch Helper ( swiper Delete Item Callback ) ĊĠĠĠĠĠĠĠ Ġitem Touch Helper . attach To RecyclerView ( re cyclerView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġundo Delete Item ( view : ĠView , Ġdelete Item : ĠTo Do Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsn ackBar Ġ= ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Deleted Ġ'${ delete Item . title }' ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ SHORT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġbutton Ġclick Ġlistener Ġin ĠSn ackBar ĊĠĠĠĠĠĠĠ Ġsn ackBar . setAction (" Undo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRestore Ġthe Ġdeleted Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . insert Data ( delete Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe ĠSn ackBar ĊĠĠĠĠĠĠĠ Ġsn ackBar . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ================= ======= Ġ[ Top ĠAction ĠBar ] Ġ================= ======= Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . list _ fragment _ menu , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSearch - Action ĊĠĠĠĠĠĠĠ Ġval Ġsearch Ġ= Ġmenu . find Item ( R . id . menu _ search ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠForce Ġchange Ġthe Ġtype Ġof Ġthe Ġaction View Ġinto ĠSearch View ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch . action View Ġas ? ĠSearch View ĊĊĠĠĠĠĠĠĠ Ġ// ĠCustom ize Ġthe ĠSearch View ĊĠĠĠĠĠĠĠ Ġsearch View ?. is Submit Button Enabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠImplement Ġthe ĠSearch Listener ĊĠĠĠĠĠĠĠ Ġsearch View ?. setOn Query Text Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ delete _ all Ġ-> Ġconfirm Removal () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort ĠBy ĠHigh ĠPriority ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ priority _ high Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . sortBy High Priority . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . setData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSort ĠBy ĠLow ĠPriority ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ priority _ low Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . sortBy Low Priority . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . setData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ================= ======= Ġ[ Top ĠAction ĠBar ] Ġ- ĠSearch Ġ================= ======= Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Through Database ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Through Database ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch Through Database ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġ"% " Ġto Ġsearch Ġin ĠDatabase Ġeasily . ĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠSQL - Query Ġwill Ġlike Ġthis : Ġ" select Ġ* Ġfrom Ġtodo _ table Ġwhere Ġtitle Ġlike Ġ% title %" ĊĠĠĠĠĠĠĠ Ġval Ġsearch Query Ġ= Ġ"% $ query %" ĊĊĠĠĠĠĠĠĠ Ġm ToDo ViewModel . search Database ( search Query ). observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" let " Ġwill Ġauto Ġset Ġthe Ġlast Ġline Ġas Ġits Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . setData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġ================= ======= Ġ[ Top ĠAction ĠBar ] Ġ- ĠDelete ĠAll Ġ================= ======= Ġ*/ ĊĠĠĠ Ġ// ĠShow ĠAlertDialog Ġto Ġconfirm Ġremoval Ġof Ġall Ġitems Ġfrom Ġdatabase Ġtable ĊĠĠĠ Ġprivate Ġfun Ġconfirm Removal () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠ Ġbuilder . setTitle (" Delete ĠEverything Ġ? ") ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage (" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġdelete ĠEverything Ġ? ") ĊĠĠĠĠĠĠĠ Ġbuilder . set Positive Button (" Yes ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Successfully ĠRemoved ĠEverything ...", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . set Negative Button (" No ") Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġshow Ġthe Ġdialog ĊĠĠĠĠĠĠĠ Ġbuilder . create (). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĊĠĠĠĠĠĠĠ Ġ// Ġavoid ĠO OM ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ