Dieses Codelab ist Teil des Kurses „Grundlagen von Android und Kotlin“. Sie können diesen Kurs am besten nutzen, wenn Sie die Codelabs der Reihe nach durcharbeiten. Alle Codelabs des Kurses sind auf der Landingpage für Codelabs zu den Grundlagen von Android und Kotlin aufgeführt.
Einführung
In den meisten Apps, in denen Listen und Tabellen mit Elementen angezeigt werden, können Nutzer mit den Elementen interagieren. Das Tippen auf ein Element in einer Liste, um die Details des Elements aufzurufen, ist ein sehr häufiger Anwendungsfall für diese Art von Interaktion. Dazu können Sie Klick-Listener hinzufügen, die auf Nutzer-Taps auf Elemente reagieren, indem sie eine Detailansicht einblenden.
In diesem Codelab fügen Sie Ihrem RecyclerView Interaktion hinzu. Dabei bauen Sie auf einer erweiterten Version der Sleep-Tracker-App aus der vorherigen Codelab-Reihe auf.
Was Sie bereits wissen sollten
- Eine einfache Benutzeroberfläche mit einer Aktivität, Fragmenten und Ansichten erstellen
- Zwischen Fragmenten wechseln und
safeArgsverwenden, um Daten zwischen Fragmenten zu übergeben. - Modelle, Modell-Factories, Transformationen und
LiveDatasowie deren Beobachter ansehen - Wie Sie eine
Room-Datenbank erstellen, ein Datenzugriffsobjekt (DAO) erstellen und Entitäten definieren. - Verwendung von Coroutinen für Datenbanken und andere lang andauernde Aufgaben.
- So implementieren Sie ein einfaches
RecyclerViewmit einemAdapter, einemViewHolderund einem Elementlayout. - So implementieren Sie die Datenbindung für
RecyclerView. - Bindungsadapter zum Transformieren von Daten erstellen und verwenden
- So verwenden Sie
GridLayoutManager.
Lerninhalte
- So machen Sie Elemente in
RecyclerViewanklickbar. Implementieren Sie einen Klick-Listener, um zu einer Detailansicht zu wechseln, wenn auf ein Element geklickt wird.
Aufgaben
- In diesem Codelab bauen Sie auf einer erweiterten Version der App „TrackMySleepQuality“ aus dem vorherigen Codelab dieser Reihe auf.
- Fügen Sie Ihrer Liste einen Klick-Listener hinzu und beginnen Sie, auf Nutzerinteraktionen zu warten. Wenn ein Listenelement angetippt wird, wird die Navigation zu einem Fragment mit Details zum angeklickten Element ausgelöst. Der Startercode enthält Code für das Detailfragment sowie den Navigationscode.
Die Start-App für den Schlaftracker hat zwei Bildschirme, die durch Fragmente dargestellt werden, wie in der Abbildung unten zu sehen ist.
|
|
Auf dem ersten Bildschirm, der links angezeigt wird, befinden sich Schaltflächen zum Starten und Beenden des Trackings. Auf dem Display werden einige der Schlafdaten des Nutzers angezeigt. Mit der Schaltfläche Löschen werden alle Daten, die die App für den Nutzer erhoben hat, dauerhaft gelöscht. Auf dem zweiten Bildschirm rechts können Sie eine Bewertung der Schlafqualität auswählen.
Diese App verwendet eine vereinfachte Architektur mit einem UI-Controller, einem View-Modell und LiveData sowie einer Room-Datenbank zum Speichern von Schlafdaten.

In diesem Codelab fügen Sie die Möglichkeit hinzu, auf das Tippen eines Nutzers auf ein Element im Raster zu reagieren. Dadurch wird ein Detailbildschirm wie der unten gezeigte aufgerufen. Der Code für diesen Bildschirm (Fragment, Ansichtsmodell und Navigation) wird mit der Starter-App bereitgestellt. Sie implementieren den Mechanismus zur Verarbeitung von Klicks.

Schritt 1: Starter-App herunterladen
- Laden Sie den RecyclerViewClickHandler-Startercode von GitHub herunter und öffnen Sie das Projekt in Android Studio.
- Erstelle die Start-App für den Schlaftracker und führe sie aus.
[Optional] App aktualisieren, wenn Sie die App aus dem vorherigen Codelab verwenden möchten
Wenn Sie mit der Starter-App arbeiten, die in GitHub für dieses Codelab bereitgestellt wird, fahren Sie mit dem nächsten Schritt fort.
Wenn Sie Ihre eigene Schlaftracking-App, die Sie im vorherigen Codelab erstellt haben, weiterhin verwenden möchten, folgen Sie der Anleitung unten, um Ihre vorhandene App so zu aktualisieren, dass sie den Code für das Detailbildschirm-Fragment enthält.
- Auch wenn Sie Ihre vorhandene App weiter verwenden, sollten Sie den RecyclerViewClickHandler-Startercode von GitHub abrufen, damit Sie die Dateien kopieren können.
- Kopieren Sie alle Dateien im Paket
sleepdetail. - Kopieren Sie im Ordner
layoutdie Dateifragment_sleep_detail.xml. - Kopieren Sie den aktualisierten Inhalt von
navigation.xml, in dem die Navigation für diesleep_detail_fragmenthinzugefügt wird. - Fügen Sie im Paket
databaseinSleepDatabaseDaodie neue MethodegetNightWithId()hinzu:
/**
* Selects and returns the night with given nightId.
*/
@Query("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
fun getNightWithId(key: Long): LiveData<SleepNight>- Fügen Sie in
res/values/stringsdie folgende String-Ressource hinzu:
<string name="close">Close</string>- Bereinigen Sie Ihre App und erstellen Sie sie neu, um die Datenbindung zu aktualisieren.
Schritt 2: Code für den Bildschirm mit den Schlafdetails prüfen
In diesem Codelab implementieren Sie einen Click-Handler, der zu einem Fragment navigiert, in dem Details zur angeklickten Schlafnacht angezeigt werden. Der Startercode enthält bereits das Fragment und den Navigationsgraphen für diese SleepDetailFragment, da es sich um eine beträchtliche Menge an Code handelt und Fragmente und Navigation nicht Teil dieses Codelabs sind. Machen Sie sich mit dem folgenden Code vertraut:
- Suchen Sie in Ihrer App nach dem
sleepdetail-Paket. Dieses Paket enthält das Fragment, das View-Modell und die View-Modell-Factory für ein Fragment, in dem Details zu einer Nacht Schlaf angezeigt werden. - Öffnen Sie im Paket
sleepdetailden Code fürSleepDetailViewModelund sehen Sie ihn sich an. Dieses Ansichtsmodell akzeptiert den Schlüssel für einSleepNightund ein DAO im Konstruktor.
Der Hauptteil der Klasse enthält Code zum Abrufen desSleepNightfür den angegebenen Schlüssel und die VariablenavigateToSleepTracker, um die Rückkehr zurSleepTrackerFragmentzu steuern, wenn die Schaltfläche Schließen gedrückt wird.
Die FunktiongetNightWithId()gibt einLiveData<SleepNight>zurück und ist inSleepDatabaseDao(im Paketdatabase) definiert. - Öffnen Sie im Paket
sleepdetailden Code fürSleepDetailFragmentund sehen Sie ihn sich an. Achten Sie auf die Einrichtung für die Datenbindung, das Ansichtsmodell und den Observer für die Navigation. - Öffnen Sie im Paket
sleepdetailden Code fürSleepDetailViewModelFactory.
und sehen Sie ihn sich an. - Sehen Sie sich im Layoutordner die Datei
fragment_sleep_detail.xmlan. Beachte die im<data>-Tag definierte VariablesleepDetailViewModel, um die Daten für die Anzeige in jeder Ansicht aus dem Ansichtsmodell abzurufen.
Das Layout enthält einConstraintLayoutmit einemImageViewfür die Schlafqualität, einemTextViewfür die Qualitätsbewertung, einemTextViewfür die Schlafdauer und einemButtonzum Schließen des Detailfragments. - Öffnen Sie die Datei
navigation.xml. Fürsleep_tracker_fragmentgibt es eine neue Aktion fürsleep_detail_fragment.
Die neue Aktionaction_sleep_tracker_fragment_to_sleepDetailFragmentist die Navigation vom Fragment des Schlaftrackers zum Detailbildschirm.
In dieser Aufgabe aktualisieren Sie RecyclerView, damit auf Nutzer-Taps mit einem Detailbildschirm für das ausgewählte Element reagiert wird.
Das Empfangen und Verarbeiten von Klicks ist eine zweiteilige Aufgabe: Zuerst müssen Sie den Klick empfangen und feststellen, auf welches Element geklickt wurde. Anschließend müssen Sie auf den Klick mit einer Aktion reagieren.
Wo ist also der beste Ort, um einen Klick-Listener für diese App hinzuzufügen?
- Das
SleepTrackerFragmententhält viele Ansichten. Wenn Sie also auf Fragmentebene auf Click-Events warten, erfahren Sie nicht, auf welches Element geklickt wurde. Sie erfahren nicht einmal, ob es sich um ein angeklicktes Element oder eines der anderen UI-Elemente gehandelt hat. - Wenn Sie sich die Daten auf
RecyclerView-Ebene ansehen, ist es schwierig herauszufinden, auf welchen Artikel in der Liste der Nutzer genau geklickt hat. - Die beste Möglichkeit, Informationen zu einem angeklickten Element zu erhalten, ist das
ViewHolder-Objekt, da es ein Listenelement darstellt.
Die ViewHolder ist zwar ein guter Ort, um auf Klicks zu warten, aber in der Regel nicht der richtige Ort, um sie zu verarbeiten. Wo sollten die Klicks also am besten verarbeitet werden?
- Im
Adapterwerden Datenelemente in Ansichten angezeigt, sodass Sie Klicks im Adapter verarbeiten können. Die Aufgabe des Adapters besteht jedoch darin, Daten für die Anzeige anzupassen, nicht sich um die App-Logik zu kümmern. - Klicks sollten in der Regel im
ViewModelverarbeitet werden, da es Zugriff auf die Daten und die Logik hat, um zu bestimmen, was als Reaktion auf den Klick geschehen muss.ViewModel
Schritt 1: Klick-Listener erstellen und über das Elementlayout auslösen
- Öffnen Sie im Ordner
sleeptrackerdie Datei SleepNightAdapter.kt. - Erstellen Sie am Ende der Datei auf der obersten Ebene eine neue Listener-Klasse,
SleepNightListener.
class SleepNightListener() {
}- Fügen Sie in der Klasse
SleepNightListenereine FunktiononClick()hinzu. Wenn auf die Ansicht geklickt wird, in der ein Listenelement angezeigt wird, ruft die Ansicht dieseonClick()-Funktion auf. Sie legen dieandroid:onClick-Eigenschaft der Ansicht später auf diese Funktion fest.
class SleepNightListener() {
fun onClick() =
}- Fügen Sie
onClick()ein Funktionsargumentnightvom TypSleepNighthinzu. Die Ansicht weiß, welches Element sie anzeigt, und diese Informationen müssen für die Verarbeitung des Klicks weitergegeben werden.
class SleepNightListener() {
fun onClick(night: SleepNight) =
}- Um zu definieren, was
onClick()tut, stellen Sie im Konstruktor vonSleepNightListenereinenclickListener-Callback bereit und weisen Sie ihnonClick()zu.
Wenn Sie der Lambda-Funktion, die den Klick verarbeitet, einen Namen geben,clickListener, können Sie sie leichter nachverfolgen, wenn sie zwischen Klassen übergeben wird. Für denclickListener-Callback ist nur dienight.nightIderforderlich, um auf Daten aus der Datenbank zuzugreifen. Ihre fertigeSleepNightListener-Klasse sollte so aussehen:
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
fun onClick(night: SleepNight) = clickListener(night.nightId)
}- Öffnen Sie list_item_sleep_night.xml..
- Fügen Sie im
data-Block eine neue Variable hinzu, damit dieSleepNightListener-Klasse über die Datenbindung verfügbar ist. Geben Sie dem neuen<variable>einennamevonclickListener.Legen Sietypeauf den vollständig qualifizierten Namen der Klassecom.example.android.trackmysleepquality.sleeptracker.SleepNightListenerfest, wie unten dargestellt. Über dieses Layout können Sie jetzt inSleepNightListenerauf die FunktiononClick()zugreifen.
<variable
name="clickListener"
type="com.example.android.trackmysleepquality.sleeptracker.SleepNightListener" />- Wenn Sie auf Klicks auf einen beliebigen Teil dieses Listeneintrags reagieren möchten, fügen Sie das Attribut
android:onClickdemConstraintLayouthinzu.
Legen Sie das Attribut mit einer Lambda-Funktion für die Datenbindung aufclickListener:onClick(sleep)fest, wie unten gezeigt:
android:onClick="@{() -> clickListener.onClick(sleep)}"Schritt 2: Klick-Listener an den View-Holder und das Binding-Objekt übergeben
- Öffnen Sie SleepNightAdapter.kt.
- Ändern Sie den Konstruktor der Klasse
SleepNightAdapter, damit er einval clickListener: SleepNightListenerempfängt. Wenn der Adapter dieViewHolderbindet, muss er ihr diesen Click-Listener zur Verfügung stellen.
class SleepNightAdapter(val clickListener: SleepNightListener):
ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {- Aktualisieren Sie in
onBindViewHolder()den Aufruf vonholder.bind()so, dass der Click Listener auch anViewHolderübergeben wird. Sie erhalten einen Compilerfehler, weil Sie dem Funktionsaufruf einen Parameter hinzugefügt haben.
holder.bind(getItem(position)!!, clickListener)- Fügen Sie
bind()den ParameterclickListenerhinzu. Dazu müssen Sie den Cursor auf den Fehler setzen undAlt+Enter(Windows) oderOption+Enter(Mac) drücken, wie im Screenshot unten zu sehen ist.
- Weisen Sie in der Klasse
ViewHolderund in der Funktionbind()den Klick-Listener dem Objektbindingzu. Sie sehen eine Fehlermeldung, weil Sie das Bindungsobjekt aktualisieren müssen.
binding.clickListener = clickListener- Wenn Sie die Datenbindung aktualisieren möchten, bereinigen Sie Ihr Projekt und erstellen Sie es neu. Möglicherweise müssen Sie auch Caches entwerten. Sie haben also einen Klicklistener aus dem Adapterkonstruktor übernommen und ihn bis zum View-Holder und in das Binding-Objekt übergeben.
Schritt 3: Toast anzeigen, wenn ein Element angetippt wird
Sie haben jetzt den Code, um einen Klick zu erfassen, aber noch nicht implementiert, was passiert, wenn auf ein Listenelement getippt wird. Die einfachste Reaktion besteht darin, beim Klicken auf ein Element einen Toast mit nightId anzuzeigen. So wird überprüft, ob beim Klicken auf ein Listenelement der richtige nightId erfasst und weitergegeben wird.
- Öffnen Sie SleepTrackerFragment.kt.
- Suchen Sie in
onCreateView()nach der Variableadapter. Beachten Sie, dass ein Fehler angezeigt wird, da jetzt ein Parameter für den Klick-Listener erwartet wird. - Definieren Sie einen Klick-Listener, indem Sie ein Lambda an
SleepNightAdapterübergeben. Dieses einfache Lambda zeigt nur einen Toast mit demnightIdan, wie unten dargestellt. Sie müssenToastimportieren. Nachfolgend finden Sie die vollständige aktualisierte Definition.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})- Führen Sie die App aus, tippen Sie auf Elemente und prüfen Sie, ob ein Toast mit der richtigen
nightIdangezeigt wird. Da die Elemente ansteigendenightId-Werte haben und in der App die letzte Nacht zuerst angezeigt wird, befindet sich das Element mit dem niedrigstennightId-Wert unten in der Liste.
In dieser Aufgabe ändern Sie das Verhalten, wenn auf ein Element in der RecyclerView geklickt wird. Anstatt einen Toast anzuzeigen, navigiert die App zu einem Detailfragment, in dem weitere Informationen zur angeklickten Nacht angezeigt werden.
Schritt 1: Aufruf durch Klicken
In diesem Schritt ändern Sie anstelle der Anzeige eines Toasts die Lambda-Funktion für den Klicklistener in onCreateView() von SleepTrackerFragment, um nightId an SleepTrackerViewModel zu übergeben und die Navigation zu SleepDetailFragment auszulösen.
Klick-Handler-Funktion definieren:
- Öffne SleepTrackerViewModel.kt.
- Definieren Sie in
SleepTrackerViewModelgegen Ende die Click-Handler-FunktiononSleepNightClicked().
fun onSleepNightClicked(id: Long) {
}- Lösen Sie innerhalb von
onSleepNightClicked()die Navigation aus, indem Sie_navigateToSleepDetailauf den übergebenenidder angeklickten Schlafnacht festlegen.
fun onSleepNightClicked(id: Long) {
_navigateToSleepDetail.value = id
}_navigateToSleepDetailimplementieren. Definieren Sie wie zuvor eineprivate MutableLiveDatafür den Navigationsstatus. Und eine öffentlich abrufbareval.
private val _navigateToSleepDetail = MutableLiveData<Long>()
val navigateToSleepDetail
get() = _navigateToSleepDetail- Definieren Sie die Methode, die aufgerufen werden soll, nachdem die App die Navigation abgeschlossen hat. Nennen Sie es
onSleepDetailNavigated()und legen Sie als Wertnullfest.
fun onSleepDetailNavigated() {
_navigateToSleepDetail.value = null
}Fügen Sie den Code zum Aufrufen des Klick-Handlers hinzu:
- Öffnen Sie SleepTrackerFragment.kt und scrollen Sie nach unten zum Code, der den Adapter erstellt und
SleepNightListenerdefiniert, um einen Toast-Hinweis anzuzeigen.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})- Fügen Sie den folgenden Code unter dem Toast hinzu, um einen Click-Handler,
onSleepNighClicked(), insleepTrackerViewModelaufzurufen, wenn auf ein Element getippt wird. Übergeben SienightId, damit das View-Modell weiß, welche Schlafnacht abgerufen werden soll. Das führt zu einem Fehler, weil SieonSleepNightClicked()noch nicht definiert haben. Sie können den Toast beibehalten, auskommentieren oder löschen.
sleepTrackerViewModel.onSleepNightClicked(nightId)Fügen Sie den Code hinzu, um Klicks zu erfassen:
- Öffnen Sie SleepTrackerFragment.kt.
- Fügen Sie in
onCreateView()direkt über der Deklaration vonmanagerCode hinzu, um die neuenavigateToSleepDetailLiveDatazu beobachten. Wenn sichnavigateToSleepDetailändert, rufen Sie dieSleepDetailFragmentauf und übergeben Sie dienight. Rufen Sie anschließendonSleepDetailNavigated()auf. Da Sie das schon einmal in einem vorherigen Codelab gemacht haben, finden Sie hier den Code:
sleepTrackerViewModel.navigateToSleepDetail.observe(this, Observer { night ->
night?.let {
this.findNavController().navigate(
SleepTrackerFragmentDirections
.actionSleepTrackerFragmentToSleepDetailFragment(night))
sleepTrackerViewModel.onSleepDetailNavigated()
}
})- Sie führen Ihren Code aus, klicken auf ein Element und die App stürzt ab.
Nullwerte in den Binding-Adaptern verarbeiten:
- Führen Sie die App noch einmal im Debugging-Modus aus. Tippen Sie auf ein Element und filtern Sie die Protokolle, um Fehler anzuzeigen. Es wird ein Stacktrace mit etwa dem folgenden Inhalt angezeigt.
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter itemLeider ist im Stacktrace nicht ersichtlich, wo dieser Fehler ausgelöst wird. Ein Nachteil der Datenbindung ist, dass sie das Debuggen Ihres Codes erschweren kann. Die App stürzt ab, wenn Sie auf ein Element klicken, und der einzige neue Code ist für die Verarbeitung des Klicks.
Mit diesem neuen Mechanismus zur Verarbeitung von Klicks können die Binding-Adapter jedoch jetzt mit einem null-Wert für item aufgerufen werden. Insbesondere beim Start der App wird LiveData als null gestartet. Sie müssen also jedem Adapter Nullprüfungen hinzufügen.
- Ändern Sie in
BindingUtils.ktfür jeden der Binding-Adapter den Typ desitem-Arguments in „nullable“ und umschließen Sie den Textkörper mititem?.let{...}. Ihr Adapter fürsleepQualityStringkönnte beispielsweise so aussehen. Ändern Sie die anderen Adapter entsprechend.
@BindingAdapter("sleepQualityString")
fun TextView.setSleepQualityString(item: SleepNight?) {
item?.let {
text = convertNumericQualityToString(item.sleepQuality, context.resources)
}
}- Führen Sie Ihre App aus. Tippen Sie auf ein Element. Eine Detailansicht wird geöffnet.
Android Studio-Projekt: RecyclerViewClickHandler.
Damit Elemente in einem RecyclerView auf Klicks reagieren, müssen Sie Klick-Listener an Listenelemente im ViewHolder anhängen und Klicks im ViewModel verarbeiten.
Damit Elemente in einem RecyclerView auf Klicks reagieren, müssen Sie Folgendes tun:
- Erstellen Sie eine Listener-Klasse, die ein Lambda akzeptiert und es einer
onClick()-Funktion zuweist.
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
fun onClick(night: SleepNight) = clickListener(night.nightId)
}- Legen Sie den Klick-Listener für die Ansicht fest.
android:onClick="@{() -> clickListener.onClick(sleep)}"- Übergeben Sie den Klick-Listener an den Adapterkonstruktor, an den View-Holder und fügen Sie ihn dem Binding-Objekt hinzu.
class SleepNightAdapter(val clickListener: SleepNightListener):
ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()holder.bind(getItem(position)!!, clickListener)binding.clickListener = clickListener- Definieren Sie im Fragment, in dem die RecyclerView angezeigt wird und in dem Sie den Adapter erstellen, einen Klick-Listener, indem Sie eine Lambda-Funktion an den Adapter übergeben.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
sleepTrackerViewModel.onSleepNightClicked(nightId)
})- Implementieren Sie den Klick-Handler im Ansichtsmodell. Bei Klicks auf Listenelemente wird in der Regel die Navigation zu einem Detailfragment ausgelöst.
Udacity-Kurs:
Android-Entwicklerdokumentation:
In diesem Abschnitt werden mögliche Hausaufgaben für Schüler und Studenten aufgeführt, die dieses Codelab im Rahmen eines von einem Kursleiter geleiteten Kurses durcharbeiten. Es liegt in der Verantwortung des Kursleiters, Folgendes zu tun:
- Weisen Sie bei Bedarf Aufgaben zu.
- Teilen Sie den Schülern/Studenten mit, wie sie Hausaufgaben abgeben können.
- Benoten Sie die Hausaufgaben.
Lehrkräfte können diese Vorschläge nach Belieben nutzen und auch andere Hausaufgaben zuweisen, die sie für angemessen halten.
Wenn Sie dieses Codelab selbst durcharbeiten, können Sie mit diesen Hausaufgaben Ihr Wissen testen.
Beantworten Sie diese Fragen
Frage 1
Angenommen, Ihre App enthält ein RecyclerView, in dem Artikel in einer Einkaufsliste angezeigt werden. Ihre App definiert auch eine Click-Listener-Klasse:
class ShoppingListItemListener(val clickListener: (itemId: Long) -> Unit) {
fun onClick(cartItem: CartItem) = clickListener(cartItem.itemId)
}Wie machen Sie ShoppingListItemListener für die Datenbindung verfügbar? Wählen Sie eine Antwort aus.
▢ Fügen Sie in der Layoutdatei, die das RecyclerView enthält, in dem die Einkaufsliste angezeigt wird, eine <data>-Variable für ShoppingListItemListener hinzu.
▢ Fügen Sie in der Layoutdatei, die das Layout für eine einzelne Zeile in der Einkaufsliste definiert, eine <data>-Variable für ShoppingListItemListener hinzu.
▢ Fügen Sie der Klasse ShoppingListItemListener eine Funktion hinzu, um die Datenbindung zu aktivieren:
fun onBinding (cartItem: CartItem) {dataBindingEnable(true)}▢ Fügen Sie in der Klasse ShoppingListItemListener in der Funktion onClick() einen Aufruf hinzu, um die Datenbindung zu aktivieren:
fun onClick(cartItem: CartItem) = {
clickListener(cartItem.itemId)
dataBindingEnable(true)
}Frage 2
Wo fügen Sie das Attribut android:onClick hinzu, damit Elemente in einem RecyclerView auf Klicks reagieren? Wähle alle zutreffenden Antworten aus.
▢ Fügen Sie RecyclerView in der Layoutdatei, in der sie angezeigt wird, zu <androidx.recyclerview.widget.RecyclerView> hinzu.
▢ Fügen Sie es der Layoutdatei für ein Element in der Zeile hinzu. Wenn das gesamte Element anklickbar sein soll, fügen Sie es der übergeordneten Ansicht hinzu, die die Elemente in der Zeile enthält.
▢ Fügen Sie es der Layoutdatei für ein Element in der Zeile hinzu. Wenn Sie möchten, dass ein einzelnes TextView im Element anklickbar ist, fügen Sie es dem <TextView> hinzu.
▢ Fügen Sie sie immer der Layoutdatei für MainActivity hinzu.
Nächste Lektion starten:

