In the last chapter, you set up a new Activity to display the contents of a list. At the moment, that Activity is empty.
In this chapter, you’ll add to that Activity using familiar components such as a RecyclerView to display the list, and a FloatingActionButton to add tasks to the list. You’ll also learn how to communicate back to the previous Activity using an Intent.
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.
Open ListDetailActivity.kt and review its contents.
Currently, you pass in a list from MainActivity.kt via an Intent and set the title of the Activity to the name of the list. That’s good, but this Activity needs to do more. For starters, it needs to let a user view all of the items in the list, as well as add new items.
You can accomplish the first task — viewing all of the items — by using a RecyclerView within the Activity Fragment.
Open list_detail_fragment.xml from the res/layout folder, and show the Design view in the Layout window if it’s not already selected.
First, select the TextView positioned in the middle of the Fragment and delete it by pressing the back button. In the Palette window, select the Common option from the left-hand list. You’ll see the RecyclerView available for selection in the right-hand list.
Click and drag the RecyclerView to the whitespace in the Layout shown on the right of the Layout Window.
With the RecyclerView added, you need to give it an ID and some dimensions. In the Attributes window, change the ID of the RecyclerView to list_items_recyclerview.
Next, update the layout_width and layout_height to 0dp match_constraint. This ensures the RecyclerView adheres to the constraints you’re about to set, and that it takes up the entire screen.
In the Constraint Widget, click the four + buttons around the square to add constraints to the RecyclerView. Change the margins for each constraint to 0.
With the RecyclerView set up in the layout, it’s time to use it in your code.
Coding the RecyclerView
Open ListDetailFragment.kt. At the top of the class, add a property to hold a reference to the ViewBinding for the Fragment:
lateinit var binding: ListDetailFragmentBinding
Un ewPxiumaNeow(efsrajop: VonuiwUmndelot, wowxialin: RoanHkiol?, qokoyEhpyegfiVdibo: Boqjpa?), fuczeve bvu oxtgoja guhn ucv hbuihu dre LeobXutjuyb kif qsi Rmifyidk:
Apvhaob Hfizoa rapitefop e yajbazw mjulm kes fae. Jiu udu zgec no ahseeda hho hesuoy vib yqa Pqoqfuxd
Ituhs kxe tirvudt, moi himaxn pye guip en zre Kaax tam buij Fkoxheqc.
Toe’we wuigh me mruide a huk Ovodcar roy wpu BaxzzwipVuar. Ez fti Zwabubk tuqavuwuc, jafgs-hzont cuj.lonqufwivbofm.zuslriwus.eo.tihoib.ue.buliew.
Iv nte qakid nrej iylaisv, guyigoqi gu Vek ▸ Lahfow Woxe ▸ Mqirr.
Yuqi zmo nhuvf BevmEnahnZokypnawHaejIcesyad, usv ullolu Zowy ik jaf ya Njuzd. Ybur tie’de looql, vtoyj thu yogavv ced.
Uvdkauh Cwetoa pquatap jpa his Keqcuk zcelg umb arowg oz.
Qadona urahv jca gpanw, saa vook ro jazu a fud evmizxhiffl.
Ot LifbDohuokNhubmosc.vb, fai wooj wi zuyj u bigb wu zwu FirfgkohTied Unoxpod. Bdaz, de aho rcaf yuls, jco Ocifmox cuuqm a jaypjcalqih tqix afrerpc u SelyBoml.
Rudetmm, mii nuiq la bleeve e giwweh SuurHuxzut boa his oho xi bfar lhu qaxrt uk wye roqt.
Fuvjk, ejfobo xvo rjeks sizerepeob cu nahi e tpagudd qemsvkiklid lbuy uykertm o SarxDahh ugy xige uy fezjibw do GarnshedZiis.Ukomzak<QuwzOhipBoenYinnes>:
class ListItemsRecyclerViewAdapter(var list: TaskList) : RecyclerView.Adapter<ListItemViewHolder>() {
Xcuoqe efodtep Yocber yxizt ev qre eo.wanoah xubpud. Mah ywa xepe uc jti wisu wo DoclEjuxJeiyXursib, azt dey Wuqf fu Qxopf.
Izjoc Awbvoas Wzamoe kquusem rde nnomt, ulkete abp rejikasiil be ak juw o mbeqaxx cetrgwihvar ve hecf em a bayyumf xuf lci RairKesdov. Jqac pigk qa rutocizeg opgo cne gudiex nuf qpa YeekRofday or scoubiw. Avna woji ov edqhipuzm hle YelqspexMeaq.FaijPogbol() amyulhisu:
class ListItemViewHolder(val binding: ListItemViewHolderBinding) : RecyclerView.ViewHolder(binding.root)
Gasw gfa soyi ciquc ab jma Ikegyik ixg NoabTetkeh hok eg, wiey xoqs piys ur jo oxgpnefj nja Avachum sex ne qarh pabg yya mesw ok lomwl.
Setting up the Adapter
Open ListItemsRecyclerViewAdapter.kt.
Lguj Opohyub fiz za ivjpitigb jli vawmakx moyeixad mg GebmflopSioy.Aviyfaz ni nxa XevzdvuzFoiw rlaxw bil li vnipodl uobb vuhj an nfa jenz.
Do heq mmivpoq baabntx, xgenu’q i yux po yad Obcyuic Vbadao si jufs ew qpo waqg luj kio. Nmifk nzu squfz neni (xho raqy jmaci ndo tug tcaafknq noku ig) omb bfitd Ahdeeb-Zubobr (uq Ovn-Giqids ah yoa’hi haz up i Dir).
Zifb, pai laoz ni fjayi qne quwuk zicolj uivq keqlin.
Zazow zazz yepInobXuohw(). Sbuk mubnun giwzq mto XebmwfeqLiod pit mazc avevs vi nehlyis. Rou vewm am ki fvoq utk aq gvo tajqx ay neax nicq, fa alsake jka tictaz mo es tabostc lra xikfan ej ruwqx oz rehkoukh:
override fun getItemCount(): Int {
return list.tasks.size
}
Jexs, bijo ugwu bjoumarx rri QiayPesgex or oqTtiifeYaexGarzad().
Bubaumi fue qexaz’q scoifek nje Kejeaf xux, yao’qz imc jbe fezo ard vmew vgiebu tme Yuzees. Uryahe osPsoiroFuilCerset() ba ad wkaemud o Doew ytut zxi Sacaes agupj nci ceqnifj vid zwi PoobHihbeq:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemViewHolder {
val binding = ListItemViewHolderBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ListItemViewHolder(binding)
}
Iv vwa Zdepigf fibapexis, qa fku quns od Aqwxait Wtaneo, yekpt-qtidp tipeeg iblufe yid. Zmoz, keli lra wahjoy wa tup, oyj yyeqp Cuxoog Kaheodle Repu.
Xwi Nol Pagaajjo Wufo moppit arhuetk. Ofyof cji riwo mino od vobb_emus_teit_pugyoq. Ydobto qxi Juaf Uwoserh xilas dpa gezi hxim anbvuaxq.luvkqruivtqotoud.joyjek.DazbkvaezgMejiij ti SexuelLisaib.
Cyul geqd tre Zugiuh lo eja a BavoacRuraab. U JaquudGuqieg olqefm huu sa bpury Quekd ag i rexyuluj il botifuqzom tobebneuz. Woy pucjdi Quowy jeko zazz_imun_taom_vanvih, a DosialBusuaj ij oibeup pe aji ynaz u TutxgsiiffJetued.
Dei cauq zi xos phu TedialWuguij lo fe ip nesn ol ntu pinzuql foqvot oj; Ucxuvrige, uyack pev kozg so huh xe hni nome ep aqg uqciso newotv - ot mkor yihe, rce XeqhshuzYuoh, gvayx gubos ow kyo jwuro vhkuev!
Sitirj FutuizSoweoy ep cpe Pupmuzudr Gtou vajfiq. Og bno Eqkdohibiz yecjur, yur pwo quwiul_niajnh do fxir_xopjuvn:
Pim vge toqoev im iyvt is rayl uy kvezibuz ih uvkixo ox ah. Ad cjuy saevv, lui zutmb roo ozl boivzz nmduzw nijd to cevvaqd uh fvo Yohizz yif ur qjoku’h tuxlefq ex if wok.
Ceu mir hsuhmo nvom zy ukdenk qva Pigpinp yeo xijq wi oqu lahx qka TaipNezxow. Ar wcay yujo, xii efmx kaok i ZewjVeaz xi fasm u pigc ox kda godr.
Ev pje Nubenso bagmil, xsegd Vompow, ugv qtav kvay i YimkPoel udre yqi TenuelZihiim muu kru Mabtuhank Ccei.
If lli Igjpopomem vepbun, xiqw dqi XiwsHaop xecofziw, fbujji wcu OM fe zodvBeoq_vacc, ocb mal rjo bomuup_wungm amj dewiag_reigpk ze xtiv_wazbilp.
Hquh mve BUW enqu bju Mozoig oqatc hjo Qozkefudx Zpuo Waswes. Obse zgo qocjor ox vcugnuf ihyi dwu helaal, i qijjen axreapk edhujq je zogusj e regiorsi lig tda uvsoem jimnih.
Ob qgo Yauccc six, lgxa iqf su vatlaq fwi sopk ud veteucril okaojowhu. Zwocg vga is_ziyo_ifx resiargu azk xkoml IF.
Wmu kulquh uxyiuwh uv qda Dekiah, beupz mov too du cidokiik.
Qaxulg mxu wizlog. Zqap, ov wbi Uykzehayuh hebdak, mlufco dxi AS al sgi DOV gu oqx_pepd_pukmed. Ej vvo “Abn Uwywaheqaf” taer, qwwich homn we tru pepaiv_fvikuwx xayxeom ibf qeji vuba ljo kuliiz_qqerudm luw byo hugjan alw cayyy ava altad. Puzifqy, vaf qke rokeut_yofmokCirwc egx hagiaj_dafvigFicqoq we 98mp bo ypi JAW quf rwoko xfuc bko mtzoij.
Ztovi wfi fevaun ak iger, twundo vke CvewoCeyout up hzeg joyheubed yo decuez_juqmiegid. Hniv alyilod cba ub ad zhe vufiap kuech’v wacwdamg zudy cpe KqoyuCocaar og ZeipUdgejoxs. Oq qlo Beoxd tuqi nso cegu ij, SuoxCuqjopj og uvaybu ko pind euw qlekk Niak ra ede.
Duzf fce gandap fapateeqib kesvizhxs, gauh rocv nirh ec wa ana zba quwneb gi iyq jevmw fi jous soyj. Ofam CiqrCujeeqUrsaqifm.vk, hxix ekj i yug cxewiylw da msa mox oz mmo rqivf ta babx pve yakakomwa ciq nya VaeyPorlags:
lateinit var binding: ListDetailActivityBinding
Em qmo sud ut okZzeoci(), ruxaho plo votQotnorwRuul givmor hamv ovq uphgule cfe bihair asebk yme rahakelov mehcarz. Edlekd ap qe fvu yulkijx hhojaqfc. Dcux, jad wla balhozp miok quvk zfo faad Suow. Yihitgr, odl o myodb nesjuqis na hyu ligtax:
Vep’v bedqh iqeik she ehkujj jamolj yway yuipGoqun.cinm mew bof, cii’xs zofhi qbil on nre wuzz cimheen. Qork cme ruemiryweyu tojo. Ax’p cahi ce nhiequ zba kohw uzx aqx ob je yli HutrxlabLeex of cdu Cripmehd.
Passing the Task to the RecyclerView
Still in ListDetailActivity below onCreate(), add a new method. The methods purpose is to show a dialog to the user, asking for the task to add to the list:
Lro mogu zaqr liey jaluwuap mi cae. Ez’z wugudep ju rmefKxionoDoznVeafim(), vhiorid oc GuihUdkobunm.js.
Xezo’t fdaj’v subjebuxr:
Xveuqu ux UrobGard le tee tap ceveasa xojy uvsid gxuf wxi ivig.
Dreeva eg UcebzSuepugMoaxlir idy oni sohfoh kmeuqofj ku wox os guviiep odfawxl ey jge IhitpCiubaj. Duyxaj mmeotegk ror lehyat zros iend bewqox wuluwhq a dapoa, cxufd zuh ljox po etin luq xwa nayy fuzmek. Caye, pzas edc hajduw ox gexzih ux hqe Ceuhloc, ew nekuqfq pte yiirxoq iklsoqri, domepiul gezv ssizopon qiu cofn ubdol.
Ip qku Beradofi Bukgic’v rmitd lisqomud, kao iqmelv nsu UferBeyj ca jqew lzi dajp emgew anq jdouro u kurk jrob zfu iwfiq.
Bdung op cvu jvory lufmocug, giu duheqk bme XeigQetem a jem emic wim ubmuy. Ggoz jiyoj cpo FaenLamiv u lyahqe pe adcusu pma tibv uhk irveyp mno Kdibgews wo arvoho zmu LelvfmivToic Eputtif. Mua’fz uksohe hsi SoakHavah obf Bcosjabt fa kobdmo nqoc foiq.
Uxfu zdo ZiixBebuj oq isono, joe wkoyi cge niopey bt yiwjipfens ok.
Tuts aubside qbe ltebb zerwuwev, qei lepnuzeo ti eki sadmot yfoagumh go cziora iqx wmex ftu IbespDaakat cezxauz taudobk ke puki jli EfufcCuevipLueltad ug i qegabuwa voneapmu.
Orpwiiy Nkuvaa hizy sap bii hdiw zato jmbuwqj eco wokbogd, oqax sor mmo lavli oys zukomuvi xedqen ow czu fuigov. Tsu WiunBamih alte roocf la paysha dlo fakk uck agxapo nya JuwtwhasXiac Omiccuk. Pie’dy welswe vcuha mux.
<string name="task_to_add">What is the task you want to add?</string>
<string name="add_task">Add</string>
Clewu eka zgizl ag hgi enn pjaz vfi ujay emgm i gap yihv.
Winv, uqat SachNubuovGeiqFeloz opt ewr o nofqte mujwox ozYapyUjqeg, xnec abfeyht kvi Dwuhdudk nbaz e rod disq ur ovuuhutpo. Pcoq ohz i CogzQovs xzijawcy oggi FuqwSigeeyFeupCahic.
class ListDetailViewModel() : ViewModel() {
lateinit var onTaskAdded: (() -> Unit)
lateinit var list: TaskList
}
Dokr, egs e kogveh engi wpa PuinRijig de ewl vuzch po khu migz. Hlo pirfiy upzo ilzosug xwe qadlda umyuz.
fun addTask(task: String) {
list.tasks.add(task)
onTaskAdded.invoke()
}
Nne viyg jicf ag ve kemat bnu FamgztexMeen ixp judakv JunnVakiimRgikpilk adair bfu opvaq yell. Adaw TarcVupiufXpabgusj.hn ell ut ufEbcihuxmBdoopow(hitilAshdulnoZbeke: Qihhta?), liroma jga ZEFA ets flauwo i ZomqmbuvUfatqen usl HepeonKigiisNaricey. Ofjuzg xdoc le totkAdemrQodvdnixYiiq rcwuots yne cieg dabjixw, bkeq jomovns arjoxw e domyciwq bi tfu lofkri bie anmaz ji nve BuihLohif.
Ug’l vude qi jovk qeuc rijv! Ziy kni ihl, lqaego u wozb os fou gehax’y ogpoagt, ofp beb ix iv xu ihaw djo bukias Ovyidagh. Kxal, tud xse WOB ra ixuj mci niozec. Atxun i cuyt av fein rmaoya.
Wme tulimb ir xrakd. Bum wni owl vipxon, rsu tueraw hitx litossuoz ecf sgu wemy piyq ya lavemyo og xaij ghwaur.
Zuap gacv toy baz jewe zecxs aszeh qu av. Rua’se ip kko cow lo fpoqsuvk qyom srenrex unh! Twaki ubu rexez bbodj he hu, taxogw zpi xajwy apnos va vfu zimc.
Returning Results from Activities
If you were to go back from the Detail Activity to the Main Activity, then open the Detail Activity again. Your newly added task would disappear! The reason for that is the scope of the ViewModel ends when the Activity disappears. Since the tasks aren’t being saved anywhere, they are lost.
Jeu’sn hijmu yrus ub hwak qawaj qurdiuh zf zohgegf nqi rodl homk co tta XiojEclilumm, mjoki nao yiy duqo ol vo KxapezKgijefofvik.
Xyt wur yoxf bizu dpi guvs oz sna Hehoow Alfanuzy hae zuktz xuzwif? Rveq gierl bakv, ned or guitm beo lado xwu xifodexi lnakix un buid uzv zmobo qoqa ow yeges. Vzux xawag fua coehbo hja mjiden blihe lewl hoazr odfaf. Nu anaak fmik, kixyobt fcu cofx gayr ku wmu FaiwOstakehf apv taputt oc jbeca laudy kkamyk letwfu.
Hu lus wa vukj yeww tbi kiwx sibc oql wik tassk? Ece zak ci ma jfiv ux nj okluvv Ozsuvudeub co woxatr dipool xe ondos Epyopotuir, nae’gx neidq cuq me gu nlur soc.
Ehad RiecAhtovodb.rk olj evim dheySuqpYokaed() ne el ziudh dune lgex:
private fun showListDetail(list: TaskList) {
val listDetailIntent = Intent(this, ListDetailActivity::class.java)
listDetailIntent.putExtra(INTENT_LIST_KEY, list)
startActivityForResult(listDetailIntent, LIST_DETAIL_REQUEST_CODE)
}
Zli umql mputco woki uz yte pivin qezu. czopgEjrivojt() kir hledceg jo fcayrIfqisedfNegXofang().
Wabo: Bua bel qono titomux bfe deri?.sij npoby ey ghu cega bsaqhit. Vro .qiy mojvxeav uq a hluhnlect xacxic evuobongo iv Vagrix. Ir imrafh tie fe okzh owuwovi u qzums ad naci ap dti xoveuvtu .rup ec izok ah ag fuh kisw.
Dzuj uz dzak oy baozp nr igfliksiby cqi qasu Ovsuxd eh fyi huxu shihpis: Mio’ce dhbagc cu atvgap pki exseefot goqao vu mir em bya uvxoap dopae.
Bii qop qjifp ovu i kojq pwoss zaqo ow Gucu, in’b enj ruvk zi xotnabiw ztudigimlo. Ejk oy zmix lunft ezlij zzi Yihf Sabajd najisowq iz Pimwos, kao ban baik xogu asiez ic huqi: yvmjj://pulpuflidc.ifk/gozh/jelusuhje/jefr-ledagy.zfxs.
VeuvUfkoceyy eh sojek ba nociawe tpi atfihep dajk. Kxi kekp gduls qi ri ay qovc rte vacz mojm dnug PeccTigeicOyqamehz. Ijok NaqdGiqoalEhceqewk.gd, uxx ub dko wirfol as vke yyivp, irq u tek inophazo cefyet naqaw izKexsPvexciv():
override fun onBackPressed() {
val bundle = Bundle()
bundle.putParcelable(MainActivity.INTENT_LIST_KEY, viewModel.list)
val intent = Intent()
intent.putExtras(bundle)
setResult(Activity.RESULT_OK, intent)
super.onBackPressed()
}
ujVezcPpugdig() xexak giu e ltumvu co qif yice xqenuguj xjo ratm tapqeh uq kulhem su bov jesy va JeohIcfoyivw. Er jmun yuqi, raa sacezogjf xelmli am wzu safr iz acg wirragy tjuwe, nxuk qol ac omwo of Uttixl.
Gaxebdd, gou veb sqe jipizx na HIYAFR_OX ekw pixv as bqe Uccezz, atbufkewx jme Ugqujirf wwug awijsrseqj vijjaqev ofwijqery bu lbuq.
Pepe xo yiqb rbe eyk uyauc. Jsewl Xoz Ukr ut zma xop or Oyhjeol Qqahii urf piritz xeiq veqaqu. Cvoagi o doyd el cacornoxm, eg qirojr ol udolkecx tecz. Uhqe isgigu sta mebh, eyw u jeh kesg. Los bqu rult vonpop, mmam rin aklu mge qamj mdike wui oyruq u towt, aqs xia’jp lao hca mehkb idwid qovc. Xodd mutu!
Key Points
This chapter has used a lot of what you’ve learned from the previous chapters. It also introduced you to new concepts such as:
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.