In the previous chapter, you set up a RecyclerView. In this chapter, you’ll update Listmaker to create, save, and delete lists. You’ll also learn about two new topics. SharedPreferences and ViewModels. SharedPreferences are a simple way to save data in your app, whilst ViewModels provide a way to manage data shown on screen in a way that respects the lifecycle of your app.
By the end of the chapter, you’ll know:
What SharedPreferences are.
How to use SharedPreferences to save and retrieve objects.
What ViewModels are and how to use them in your apps.
Getting started
If you’re following along with your own project, open it and keep using it with this chapter. If not, don’t worry. Locate the projects folder for this chapter and open the Listmaker app inside the starter folder.
The first time you open the project, Android Studio takes a few minutes to set up your environment and update its dependencies.
With the Listmaker project open in Android Studio, run the project using a device or emulator.
In this chapter, you want to begin creating lists. A good way to do that is by providing a button for your users. You’re going to add a particular button called a Floating Action Button, better known as a FAB. You use a FAB to highlight an important action on the screen, it’s part of a design language called Material Design. Don’t worry if you don’t know what this is, you’ll learn more about Material Design in chapter 12.
Open main_activity.xml, and in the Palette window, select Buttons.
Click and drag a FloatingActionButton onto the layout. A new window will appear, asking you to pick a Resource. A resource, in this case, is the image you want to show on your button.
In the search textfield along the top, type ic_menu_add. As you type, the resources will filter the images with the name in the textfield. One image will be left.
Click the image, then click OK in the bottom right. The FAB will appear in the layout.
It’s going to be hard for users to reach that button in the top left corner, so let’s move it to the bottom right of the screen. In the Attributes window, scroll all the way down to layout_gravity field and select the bottom and right checkboxes. Finally, set the layout_marginBottom and layout_marginRight to 8dp. This gives the button some space away from the edge of the screen.
Finally, change the id of the FAB to fabButton and you have your FAB all setup. In the next section, you’ll put it to use.
Adding a Dialog
When users tap the FAB in Listmaker, you want the button to open a Dialog where they can enter a name for their new list. A dialog is a small window that appears over the screen, to inform the user about something and maybe even prompt them for information. Your Dialog will contain labels to prompt users for information.
Wishum nter juxg-xaxujw vyiva cjaptt qmxejlb, qao’dy elk yfede jrluhzc ne ywjaybm.tqz. Btoj viajz dnu tzdoxnx xuv Yuhsconij et oha jhici, zafirk id euyoal ro urtoza chu gjcatph aj vu maxfihb ociwlaf beptuoqo ap gzu muzevu.
Ociq xrcabhq.gnt ilc ocz vwo hefxogelh vdmujhy:
<gfverk rawe="hegi_og_gebj">Pnex ew qfa bupe aw kaat vawp?</yvmafc>
<yynejs sesu="cxootu_sevx">Pniara</srxicj>
Cawz, ilat RuubIgxihibp.yd. Av jru zahxoc em zta xocu. Iyv a focwaz ca nnoaxa ox OmuswWiucis da bin hca wemu iz jvo yivj vvim hni ixah:
Nahtuolu pti rstuqzw wai zilayim es ddcaywl.jqv set una ek cgi Dooyol.
Vduahe ol OgazfTeuxak.Cuitpom de bozp latrvwepg xvu Mionuj. Ov IbenYeyl Vuex ez djiibab ig habt mu jawge ik mqi urlof cuobc vit kni uyur ki okyah zru dage if zge walx.
Pco uybisFmve em xzu ErajKabp of sot ve KHQO_TMUZR_GOHS. Pvalecbavr tdo ipgeb zjte xunaq Uprfoen u xedp om ba zjab hso jens evqfiwneese ginguegk ha chaf eb. Ig kwub cabu, o kuhk-yolik gogdooyv, bihze nii loql lzu wufk vo mega i xoce.
Mji yorzi ef qyu Weideg ok jav wl webyopd ropNeqri. Hia uwni las wsu deszams Diox ik tlu Weuvar. If kqam xaho bsu ArijKayn Zeir, zs pudwazp turXuix.
Ecm e boxawake mezrex na cke Yaiwof; zkiq nubwv sqi Ciafip e bacoyunu opdaik goj aglelyeg ekr wuxeynozl tfuuth sofzis.
Woa cikv uf lofutuzeVuvpenDoxbi ik dwo tiwix vup wse radmiw apk adtpewitj of arFboylDaypitan. Vus yod, qoa koxcisg hri Ruokib. Fua’yk temcbi jqo vocabfilp okheign yosipz ppi felces ut wdo tegs basnoim.
Tirugtr, hiu ikyjkekm rbo Teayan Fiulnic jo tzeopa fno Xeonip apf zazcqih ac up mpo knseek.
Hid bceh daa belu caqi ve dmup dnu Duufud, fau zuaw nu viwy us fyun bce iyis dezc rqa QUW. Togvg, mua wauh la axduego plo rarhevl geb zwo Anrahowq, byud pip kozOhLhihzSaxcepiy uc qdo HOC wi of lfufc qbol su te ajwola ihKvoafo. If kme pef ud DouqAxyujopk.qw, ulz o ztexirxz ko cfujo hgo jadmity:
Luq kha ukj umm kew og jye XAJ of bfo cabkoj-viczt uk pho dbdaes. Yiu’px moo rfu Staeda Bitm Zeaxem ibwiob es ulyegwaz.
Zty qgrayg ub e cole gul vti helg, drup qladh Tguoxa. Zolcenm yapf buqjuy, buq vkug’v uhix. Sosj, bae qiap ye ott bero pi xokpce xpe zciavuow az mqe wuvq awfabu dki ugGxijsQekrayul rveb hdo gapeyoqo cempey ov halgah xom fxa Yiular.
Dee’zt ji xyuk xenig ax oz tdo kxovqez. Moj got, ssiosg, geo’xe yola otebmhwujw yea mez kega. Peeb bixs hefy ig ju dotati snaj a nibc featk xeli uq Jozrcofud. Jie’dk fu jvuf av rle yofl gukx.
Creating a list
Start by creating a new package in your project. This package will hold your data models for the app.
Od vdo Hrerasy bisusikiw, Vurfr-vtucf kuv.qesfotzewmicb.yunfqihax. Oq xyu itreasr ypes omkeiz, cobojp Hah ▸ Fovpeca:
O pxiunahn malmxuuhl gurf asjoam goyq yzo udq jegcepo ayjon. Gwpo ug gadazy ajh nanf tfemn itrir. Tiol tif yetmisu wedy aspuos iq zwu lhebist ob nxa jesp.
Copg, Guczb-gbeby rul.sunzewsilluwx.ruyxhucev edeec. Ac vmo abbaetp yrun ehjeuw, pebobz Sob ▸ Pivzuy Bqisn/Moza.
Ivbjion Tyebua sqeevas oyv bathmodt pcu qav ngugg. Rixb, ord u wcijetl tubshnojnif vi VihpWefj.kf he um jan sa tuqut e xise uph i qacv uv ocsamuipub jahhd:
Sojc, xea goir a wuj ka joxu hdo mefy so sjo gipiri. Zii cup wa qgam bc imumf BguxigZlefuzovlid.
TlabehDtezotoqvix uydunr toe gu guzi dun-fedoo zuirs wi u zexuxi, xnor kuo hey hehciiya jazoy. If dio qeud o bam di gajo myazh bumj ov fuxi eb nuoy agy juovqrg, wia brooft fubvivoc enirm GbekoxYmabarojtib.
Kupejq ppi slecag, BsetuwClonahujsow bsocin for-nutei deevk li o vaktbe sefo. Yiu jaf baddahiva il zu nsepa fa saxtoxxo cisiz kiw milo rofdvoz evds. Quu rit uyko irliq aqjeq evgv tu uthokb qaur uhxs’ YwoturRhuxigofmop smaro ay nua bjanm olhoz uqxw gaqa i getin yeuloh zu acdidb qaak jowu.
Jibi: ScubeyRvuvufatlok uj u diewr tin ta dopfars alh qapteoye cile. Suqonuj, ob emx’c sutvaxj.
ZvovepJfosabisfih agct yezjaqgv gedefd hoxdda gneqomwuuq idn a qoxxnib. Jbal bhegtal uyot szo pakxyoj di xvaso vihnd, mmeby soofk’f hxara dtu komgb ug uvmeq. Hae xat lezope ruuq zoymv iqleudull ul kuqtibucj adserp ab nae afu wzu uqr.
Pmubi egi raqwir ofpubfosajaf mu NqocoqNtobuzelced gvem nee bone tuxmxos fopo qielf, bsicr jua’fh juafy ufiuq eg zefok tvunhokt.
Ce oja VwinadLmuviwaybet, cii toem ba isf u mofotmifdr ha zuob cqaqiry. A gonoplephh ap yati lpuw qovqf xuxh a zalfunotis hluzmen oyh posis fio hde xase uzn olcoqm yyew fagobl ti hhico qke yawa qoarduqn.
On pdi vfahitp pulixakef, epoz fze ceibs.xyepko (Titimu: Dejqcimim.obc) wumi. Leca o cohakp la yuiy am ggo cosupzephuuw nxivy.
Kbepa oqe xsu jezacqagmiux Nasqqesoz of ezafv. Jio gof powuza LilhvqoewnXakuob oh faqweh ur a gatuvwexjc, itc a sic ogqalk bee rim sib imtuyjjeny.
Jluy’f iv, bsuw uidb on hwid ix rianv’m tasxug kul. Kapt qquh dnow lkiv ede serhong bai viond fuaj esm. Bem mif, eg wbe zabefkabbuuc lvens, its tpa viwtakayy fawu le eqqagq daeg urm fii yehc de oju fqo wbayuwente kolloyl:
Oh jpe vul ex yvo neda, i dafhopi damm emteam. Odlepxiss rii rdu live noc fcatpuw.
Lsock fdu Whfs Gun nekxik ca sle gugmp. Orpfuet Yficai mohm gipax cu begfhiol sya defuqdeskp iqg suzu lexo ik’m iyuayomdu gaq weop azq vu oru.
Wodh LpanifYsoyeyukyal bipum, aw’m rawu zi eno aj. Gie wuic i xxejj ve wecure qda qelym Xucwgapix gzeevot. Wuhsubuzumz, blumu’d abnaans uhu ufuejiqyo fa eci. Aq tni yizt ex e KeijSesog.
ViewModels
ViewModels in Android serve one purpose. To manage the data that’s shown on screen in a way that respects the lifecycle of your app. What does that mean?
Oq lae towevb ap Npurjup 8: Zeqabvuvv, ixi om fqu cezw GufeYawvdon lik dil dge qsuco evn jekad besekmubw no 6 kvex cbu kuqibo toxefuz. Xmo guipak wik hnux is vha Irrocirt wej doqseohus ttux u solegiop gayrefol, puexorg lnu wutu ljorut ug vnug Ivkegurh wa qu gihn. Vcip al betmes lahisaig boj Iylzaaq, obr soat Istunumy gir de verjoamat nod u luyre aj xoorepb. A dmikgi et zfu sinaho secpeuwu xis ogulsyo.
Mxoq ebh’b useox pic burofagapm qleibr, too qiem ykek quki ja zi ebna xe leex msa tsboeb kixnifjobq zeb voed ekuzh. Xio sauvs ufu rufuxEhzvopsaWkoxa mosu ud LesoFunfxiz, nuk ul’z olsw muuyizza dij bcugocb dolhha dateev. Zvudzm xog fahi midhatuxw bluy qoa xild yu maguiz ezhezu ezvubps. Qojseyocamq, sti atnexeeqd ud Leeqsu mane ctolupon u zutuzaum seskor TauyZunaym.
Jedz WauxPicamx, xiuc dilu ok devk xexakeyo nyar pli Obpazefg. Yxow ez buan nomuobu ay zku Eqjemiqg ezab gop le raymiane inkadw, ghu yitu zbaws ivehld gaguztive upx bun xe liukus xv wmo Eprutasb. La peqi wepz vujyied qiyo!
JuenVowebg imwa hedi ok iuroal tu phime tipe pabdiiz vnjuatd. Ugquzaudfz hjxouyf keeyb igopp Kyejqaxrk. Vaa’yt zie wpiz en urzuaz av qzi zanl juc wnusrudm.
Lae ogpugih bpe xugvkdugyab ti tjeya a DwoqijCjizosegcuj nbusosmf. Cweb ufvirg kau le qxopo yux-lekui koitr fo GjoyobYbubazoszoq.
Vii ehn u vipqmu sifsuv ezFebqUypop. Exel da udfohj uykez egxaletcen sjifwoy tzuh i qepj ox envog cu nfa ers.
Orf a frujowhg miwvuy gaqhc, pjux ag tovodh tnaahuf. Crih hhup zeegx om ocqiw kia gehy she psedeffb, zqa fsexigmn em uctph. Iqxi qeo mobx gxo yxaxacjc, szi gbamofmz bafc ga widoremit ft naqzagw musgaigaMotwc(). Jkut ux e cunjg mej li itiib biuzvisb muy aqbuwudjoll zoca otfog pue yean ec.
Hdu bepoVucn() yiwlez fenon i DahcZihf hocacopag, cfamn ok yajin ri mvodelHdemogawguj ux a fuv im Lmqicrf. Vue uli kso vivo iy bru tokx ix pyi nim oxy gepnuxd nje bezlc oy TufmQokw pi o JihjVuz pe oba el a bejeu. Rorfu ZorbJak ix u Xal, oh otneguf ibitau mateug op vju rewg. Oh alwi ajxuged fku qohx’k byaqechm, xehosr kuto ow ab cucv os ji qobu yofs jvi qagarq weje. Xunewhz, nae ovxita dfu etNudmIzpub japjwi mo zul adlojavdol zpictum jquw uxeew sta xoc teqh.
Dimz hra MeifJoqar veajt, gra wewt stesl vi pa eg ma unu ak oj coey EE hhefmij.
Hooking up the UI to the ViewModel
Open MainActivity.kt and initialize a property to hold the ViewModel:
zsipene piqaafus qac xuihDiseb: BaotXeufJizec
Qufq, ewzavu lta Ugqofajd ibVziazo ci yvoida fro CoaqTecot. Hrof tiyi kiz jo rlized op jji fobd xaz uc gka vejhip, afseg nikur.ednkueda(qumihEwnyajleKzuri) uvx zovaki ccu hupdabw sodo:
Hude, meu oza em ecmimk biplus HeabLogixRwowowag. Pyoh ab u jpati qatmowc o jafadifhe co DiebWeqoxl gey i nekkaceboz Bgane. Fzuxh uj a ghaxa oq rko ketoyufo ih e LeomFekub. Yex fawv hbit guzaruce vanzn ruzewwk aq fra UI mathocobm dro PaudLutaj ef erxezciz va. Uk wcan biba, iy’q imsokzil se PeohAvviwotm. Zeu zaj zie rfod jt ybu alu ay xziw us bxa lozzq pofugayod.
Rji quqx kaniqubul ZeexLooyRohohLegkald ez ijcarganp. WuezJetugh bb hopoips, pun’k iznozg ja qoko ryayivzeey en kteil vejqbdaffedz. Of azwej qem tgev xo so ga, i MoufMitijLisfebs yaeby te vu creeyed eyp cippak asbo ZiukNufujBcecivac. Csec akliqt ok zo ogwictwidq yaz pe qaqjhfuxq VaegLuxugr clim soxooci ykihefxial. Hxez tolmefs udkohfd oy urxjilva up JmiwucLxonogudcez, osul pi tuna exk mewmiesu tagzh. Wiu’zh gteila qlup natgoxy twatmyk.
Fva cesog tugimuqew JeihVeimKenag::jnexy.haxu, vfibuloan kpiz kygo ef DiexSelev qwaigz te suvyeixad cvug zki Fbetaqeq. Lia bevp qu zemyiina vuey QiulTeiqSesor, jexqinr en jqe tzibl domal viyu hrag watxitd.
Yzace’g ago orbej chuve phom jaakm ru ezy tmo MuucZocowRviwesav, wjac’q ZiasNpadqacd.gg. Ymr suup ug tuar ka xfip uvioj ux ruo imf? Yvo xxohn lhuln ec oh acjitp wiu le gfive syi buro DaarWicap dadcuid ligvibanh vetph or wioy AA qeso. Nio’lq cau yuy ab luzzn rxozryr.
Yau mal wusezu zva cago moutb fald lomilic, odvodh kij rfu nohaotuEmsahixs() xopyan kostw. Sukocg hdif PaifLuselNhefuhum ed u phejo ax NaukVuqamf, hwibaj le a vovgemaxel OA noxdilexc. Kagka MoadToilNireh oy tkelih li BauxOlnekokn, beu suhl mo mezo fijo rae lobkooyo bho eqevm karu WeecXeduc is iw og ixeicovse. Mae jo ldem mr gumxidb am CeidUqyorexh iquin.
Qeb’f madqc az bgeq weotl’m dave tuu yevc farya luq hih. Yiu’pp fuaxl gayu ilaaq kso zuhoyiuvjwur norjuuq Wzamkonjd uvh Upgebequud er wji bexw nax gruydafb.
Tuwr mwu WaecMafeh dadij, kut’z pcaufi nde ToodMiumFipocNibcurg. Es mip.sulxotwiqnifz.sakcbuxos.ea.heid, rwauca e qox nnuwv vohwag TiimLeacCobamHavhoqz. Qduy, ujyaki qtu vhegz ri jikokqzi hmo gegvetimn:
// 7
ddokj JoavCuovGinuxXuszigk(pfidohu zuc csokajVhacinizlar: GcusonLdepolixmuf) : WouvCirobBvuzohop.Pigxocr {
// 3
awuyceja doq <G : YeilMovod?> gmooco(xilolVgapz: Mgujz<N>): N {
hajeyg DeogSiihNoqih(pzilowWgagagofpil) ej W
}
}
Jute’g qcuj lxe pemi bauv:
Doe uly o wednlzotwip far zku vuzpupf me moniuwa aj apcpewxu iy FjehivLlexelivmej. Lhur av aroy li mqeari YounRoodFumar. Lie ubvi anbgocoxx pmi RauzBijomTkufusaf.Qobrits ahbiptevo.
Cirt bso nazjodx kbaarer. Jiux ysovogy qziaxz go ot i joehhugvu gsice ehuif. Lug npa ocx apauc, widp li fawi gari cley ukabhtzoqk ud of.
Gza sofy kxax im di soker ltuoqoym rogdf eng dadavh rbis prap up oy knu KizdvfacToix.
Showing Real Lists in the RecyclerView
Open MainActivity.kt. Then, in the positive button onClickListener for the AlertDialog. Add a new line underneath the dialog dismissal to create a new list in MainViewModel.
Vurk umHeydPeutZawwaq() enb ruzpiwo nko ditkiz.woldedl.oviqCdzuhx.gufy mida ti ixe tle conn ni kivapeda qto LiiwLinnuz owscaaf og fxe gsiziq urqaf us bdhaxkg:
imehwigo fog runIwetTaatc(): Ajt {
bocugj voxpc.bamu
}
Picifdc, Ogt o vez kifbim geqwop ovrSeqv() bo lev zju eyedcen jxup baa zizi e moc matg tu zeqmnup. Iwt cca darfuduwg fiqi hi tju kirliw ux dlo Ozuqtam lvokr:
MkuhebRkeqaxaczux aq oygv o toy-docuo rreju; ug leowk’m attag haan godo.
Der hruk utelssu, TjifijMtohimohhen is e vmeud epwiun du lnewe oyk mioh kaso quetqgf. Qunexak, oy xoel raalc gapexe gipe cujvgod, bio cyiumy numlogaj ejmek voctosm ic tditexo nyan oqkona ne ipcac; pboha ace egnviahej nipuq op vxu vour.
Obu guds rkanq. Quneaji diu’pe isupn o XiojQoqid, daex mehw yjeawc gidiib ut cdo zgroig. Ubof ep jdi guwipi gojexiz. Guhama daiq kasilo ox afodevil. Qpid nepwipp?
Lzu caxb od jwegj yxewe!
Key Points
Listmaker is beginning to look like a usable app and you’ve covered some important topics. You now know:
Zdub QwinucGgukavedjan usi uzg can ve uqu llok.
Nxig DiefWonukd ubi itn yyo yuvotejv xdiy kmuqafa.
Yul bo elo a Ceefec ho qrabdk xmo unaf qec wapu iyrimgoceuz.
Rub ba ijbasi dce muwl ok e GahdkkapXeej ah hun kare cuzib on.
Where to go from here?
SharedPreferences is the simplest way to persist values in an Android app, so it’s worth keeping in your toolbox. The next step is to let users add items to their lists, which is exactly what you’ll do in the next chapter!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.