Android Kotlin Fundamentals 07.4: Interacting with RecyclerView items

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 safeArgs verwenden, um Daten zwischen Fragmenten zu übergeben.
  • Modelle, Modell-Factories, Transformationen und LiveData sowie 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 RecyclerView mit einem Adapter, einem ViewHolder und 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 RecyclerView anklickbar. 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

  1. Laden Sie den RecyclerViewClickHandler-Startercode von GitHub herunter und öffnen Sie das Projekt in Android Studio.
  2. 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.

  1. Auch wenn Sie Ihre vorhandene App weiter verwenden, sollten Sie den RecyclerViewClickHandler-Startercode von GitHub abrufen, damit Sie die Dateien kopieren können.
  2. Kopieren Sie alle Dateien im Paket sleepdetail.
  3. Kopieren Sie im Ordner layout die Datei fragment_sleep_detail.xml.
  4. Kopieren Sie den aktualisierten Inhalt von navigation.xml, in dem die Navigation für die sleep_detail_fragment hinzugefügt wird.
  5. Fügen Sie im Paket database in SleepDatabaseDao die neue Methode getNightWithId() 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>
  1. Fügen Sie in res/values/strings die folgende String-Ressource hinzu:
<string name="close">Close</string>
  1. 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:

  1. 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.

  2. Öffnen Sie im Paket sleepdetail den Code für SleepDetailViewModel und sehen Sie ihn sich an. Dieses Ansichtsmodell akzeptiert den Schlüssel für ein SleepNight und ein DAO im Konstruktor.

    Der Hauptteil der Klasse enthält Code zum Abrufen des SleepNight für den angegebenen Schlüssel und die Variable navigateToSleepTracker, um die Rückkehr zur SleepTrackerFragment zu steuern, wenn die Schaltfläche Schließen gedrückt wird.

    Die Funktion getNightWithId() gibt ein LiveData<SleepNight> zurück und ist in SleepDatabaseDao (im Paket database) definiert.

  3. Öffnen Sie im Paket sleepdetail den Code für SleepDetailFragment und sehen Sie ihn sich an. Achten Sie auf die Einrichtung für die Datenbindung, das Ansichtsmodell und den Observer für die Navigation.

  4. Öffnen Sie im Paket sleepdetail den Code für SleepDetailViewModelFactory.

    und sehen Sie ihn sich an.
  5. Sehen Sie sich im Layoutordner die Datei fragment_sleep_detail.xml an. Beachte die im <data>-Tag definierte Variable sleepDetailViewModel, um die Daten für die Anzeige in jeder Ansicht aus dem Ansichtsmodell abzurufen.

    Das Layout enthält ein ConstraintLayout mit einem ImageView für die Schlafqualität, einem TextView für die Qualitätsbewertung, einem TextView für die Schlafdauer und einem Button zum Schließen des Detailfragments.

  6. Öffnen Sie die Datei navigation.xml. Für sleep_tracker_fragment gibt es eine neue Aktion für sleep_detail_fragment.

    Die neue Aktion action_sleep_tracker_fragment_to_sleepDetailFragment ist 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 SleepTrackerFragment enthä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 Adapter werden 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 ViewModel verarbeitet 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

  1. Öffnen Sie im Ordner sleeptracker die Datei SleepNightAdapter.kt.
  2. Erstellen Sie am Ende der Datei auf der obersten Ebene eine neue Listener-Klasse, SleepNightListener.
class SleepNightListener() {
    
}
  1. Fügen Sie in der Klasse SleepNightListener eine Funktion onClick() hinzu. Wenn auf die Ansicht geklickt wird, in der ein Listenelement angezeigt wird, ruft die Ansicht diese onClick()-Funktion auf. Sie legen die android:onClick-Eigenschaft der Ansicht später auf diese Funktion fest.
class SleepNightListener() {
    fun onClick() = 
}
  1. Fügen Sie onClick() ein Funktionsargument night vom Typ SleepNight hinzu. 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) = 
}
  1. Um zu definieren, was onClick() tut, stellen Sie im Konstruktor von SleepNightListener einen clickListener-Callback bereit und weisen Sie ihn onClick() 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 den clickListener-Callback ist nur die night.nightId erforderlich, um auf Daten aus der Datenbank zuzugreifen. Ihre fertige SleepNightListener-Klasse sollte so aussehen:
class SleepNightListener(val clickListener: (sleepId: Long) -> Unit) {
   fun onClick(night: SleepNight) = clickListener(night.nightId)
}
  1. Öffnen Sie list_item_sleep_night.xml..
  2. Fügen Sie im data-Block eine neue Variable hinzu, damit die SleepNightListener-Klasse über die Datenbindung verfügbar ist. Geben Sie dem neuen <variable> einen name von clickListener. Legen Sie type auf den vollständig qualifizierten Namen der Klasse com.example.android.trackmysleepquality.sleeptracker.SleepNightListener fest, wie unten dargestellt. Über dieses Layout können Sie jetzt in SleepNightListener auf die Funktion onClick() zugreifen.
<variable
            name="clickListener"
            type="com.example.android.trackmysleepquality.sleeptracker.SleepNightListener" />
  1. Wenn Sie auf Klicks auf einen beliebigen Teil dieses Listeneintrags reagieren möchten, fügen Sie das Attribut android:onClick dem ConstraintLayout hinzu.

    Legen Sie das Attribut mit einer Lambda-Funktion für die Datenbindung auf clickListener:onClick(sleep) fest, wie unten gezeigt:
android:onClick="@{() -> clickListener.onClick(sleep)}"

Schritt 2: Klick-Listener an den View-Holder und das Binding-Objekt übergeben

  1. Öffnen Sie SleepNightAdapter.kt.
  2. Ändern Sie den Konstruktor der Klasse SleepNightAdapter, damit er ein val clickListener: SleepNightListener empfängt. Wenn der Adapter die ViewHolder bindet, muss er ihr diesen Click-Listener zur Verfügung stellen.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
  1. Aktualisieren Sie in onBindViewHolder() den Aufruf von holder.bind() so, dass der Click Listener auch an ViewHolder übergeben wird. Sie erhalten einen Compilerfehler, weil Sie dem Funktionsaufruf einen Parameter hinzugefügt haben.
holder.bind(getItem(position)!!, clickListener)
  1. Fügen Sie bind() den Parameter clickListener hinzu. Dazu müssen Sie den Cursor auf den Fehler setzen und Alt+Enter (Windows) oder Option+Enter (Mac) drücken, wie im Screenshot unten zu sehen ist.

  1. Weisen Sie in der Klasse ViewHolder und in der Funktion bind() den Klick-Listener dem Objekt binding zu. Sie sehen eine Fehlermeldung, weil Sie das Bindungsobjekt aktualisieren müssen.
binding.clickListener = clickListener
  1. 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.

  1. Öffnen Sie SleepTrackerFragment.kt.
  2. Suchen Sie in onCreateView() nach der Variable adapter. Beachten Sie, dass ein Fehler angezeigt wird, da jetzt ein Parameter für den Klick-Listener erwartet wird.
  3. Definieren Sie einen Klick-Listener, indem Sie ein Lambda an SleepNightAdapter übergeben. Dieses einfache Lambda zeigt nur einen Toast mit dem nightId an, wie unten dargestellt. Sie müssen Toast importieren. Nachfolgend finden Sie die vollständige aktualisierte Definition.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. Führen Sie die App aus, tippen Sie auf Elemente und prüfen Sie, ob ein Toast mit der richtigen nightId angezeigt wird. Da die Elemente ansteigende nightId-Werte haben und in der App die letzte Nacht zuerst angezeigt wird, befindet sich das Element mit dem niedrigsten nightId-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:

  1. Öffne SleepTrackerViewModel.kt.
  2. Definieren Sie in SleepTrackerViewModel gegen Ende die Click-Handler-Funktion onSleepNightClicked().
fun onSleepNightClicked(id: Long) {

}
  1. Lösen Sie innerhalb von onSleepNightClicked() die Navigation aus, indem Sie _navigateToSleepDetail auf den übergebenen id der angeklickten Schlafnacht festlegen.
fun onSleepNightClicked(id: Long) {
   _navigateToSleepDetail.value = id
}
  1. _navigateToSleepDetail implementieren. Definieren Sie wie zuvor eine private MutableLiveData für den Navigationsstatus. Und eine öffentlich abrufbare val.
private val _navigateToSleepDetail = MutableLiveData<Long>()
val navigateToSleepDetail
   get() = _navigateToSleepDetail
  1. Definieren Sie die Methode, die aufgerufen werden soll, nachdem die App die Navigation abgeschlossen hat. Nennen Sie es onSleepDetailNavigated() und legen Sie als Wert null fest.
fun onSleepDetailNavigated() {
    _navigateToSleepDetail.value = null
}

Fügen Sie den Code zum Aufrufen des Klick-Handlers hinzu:

  1. Öffnen Sie SleepTrackerFragment.kt und scrollen Sie nach unten zum Code, der den Adapter erstellt und SleepNightListener definiert, um einen Toast-Hinweis anzuzeigen.
val adapter = SleepNightAdapter(SleepNightListener { nightId ->
   Toast.makeText(context, "${nightId}", Toast.LENGTH_LONG).show()
})
  1. Fügen Sie den folgenden Code unter dem Toast hinzu, um einen Click-Handler, onSleepNighClicked(), in sleepTrackerViewModel aufzurufen, wenn auf ein Element getippt wird. Übergeben Sie nightId, damit das View-Modell weiß, welche Schlafnacht abgerufen werden soll. Das führt zu einem Fehler, weil Sie onSleepNightClicked() 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:

  1. Öffnen Sie SleepTrackerFragment.kt.
  2. Fügen Sie in onCreateView() direkt über der Deklaration von manager Code hinzu, um die neue navigateToSleepDetail LiveData zu beobachten. Wenn sich navigateToSleepDetail ändert, rufen Sie die SleepDetailFragment auf und übergeben Sie die night. Rufen Sie anschließend onSleepDetailNavigated() 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()
            }
        })
  1. Sie führen Ihren Code aus, klicken auf ein Element und die App stürzt ab.

Nullwerte in den Binding-Adaptern verarbeiten:

  1. 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 item

Leider 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.

  1. Ändern Sie in BindingUtils.kt für jeden der Binding-Adapter den Typ des item-Arguments in „nullable“ und umschließen Sie den Textkörper mit item?.let{...}. Ihr Adapter für sleepQualityString kö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)
   }
}
  1. 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: 7.5: Headers in RecyclerView