Android Kotlin Fundamentals 07.5: Header in RecyclerView

Dieses Codelab ist Teil des Android Kotlin Fundamentals-Kurss. Sie profitieren von diesem Kurs, wenn Sie nacheinander die Codelabs durcharbeiten. Alle Kurs-Codelabs finden Sie auf der Landingpage für Kotlin-Grundlagen für Android-Entwickler.

Einführung

In diesem Codelab lernen Sie, wie Sie einen Header hinzufügen, der die Breite der Liste in einem RecyclerView abdeckt. Sie bauen auf der Schlaf-Tracker-App aus früheren Codelabs auf.

Was Sie bereits wissen sollten

  • Erstellen einer einfachen Benutzeroberfläche mit einer Aktivität, Fragmenten und Datenansichten
  • Wie du zwischen Fragmenten wechselst und wie safeArgs mit Daten zwischen Fragmenten weitergegeben wird.
  • Modelle ansehen, Modellfabriken, Transformationen und LiveData und ihre Betrachter ansehen.
  • Erstellen einer Room-Datenbank, eines DAO und Definieren von Entitäten.
  • Koroutinen für Datenbankinteraktionen und andere lang andauernde Aufgaben verwenden
  • Einfache RecyclerView mit einem Adapter-, ViewHolder- und Elementlayout implementieren
  • So implementieren Sie die Datenbindung für RecyclerView.
  • Bindungsadapter zum Transformieren von Daten erstellen und verwenden.
  • GridLayoutManager verwenden
  • So erfassen und verarbeiten Sie Klicks auf Elemente in einem RecyclerView.

Lerninhalte

  • Wie kann ich mehrere ViewHolder mit RecyclerView verwenden, um Elemente mit einem anderen Layout hinzuzufügen? Hier erfahren Sie, wie Sie mit einem zweiten ViewHolder über den in RecyclerView angezeigten Elementen eine Kopfzeile hinzufügen.

Aufgaben

  • baue auf die TrackMySleepquality-App des vorherigen Codelabs in dieser Serie auf.
  • Fügen Sie einen Header hinzu, der die Breite des Bildschirms oberhalb der Schlaf Nächte in der RecyclerView abdeckt.

Die Schlaf-Tracker-App, auf die Sie beginnen, hat drei Bildschirme, die als Fragmente dargestellt sind (siehe Abbildung unten).

Auf dem ersten Bildschirm auf der linken Seite finden Sie Schaltflächen zum Starten und Beenden der Aufzeichnung. Auf dem Bildschirm werden einige Schlafdaten des Nutzers angezeigt. Mit der Schaltfläche Löschen werden alle Daten gelöscht, die die App für den Nutzer erfasst hat. Der zweite Bildschirm in der Mitte zeigt die Schlafqualität an. Der dritte Bildschirm ist eine Detailansicht, die geöffnet wird, wenn der Nutzer auf ein Element im Raster tippt.

Diese App verwendet eine vereinfachte Architektur mit einem UI-Controller, Modell ansehen und LiveData sowie eine Room-Datenbank, um Schlafdaten zu speichern.

In diesem Codelab fügen Sie dem Raster der angezeigten Elemente eine Kopfzeile hinzu. Der endgültige Hauptbildschirm sieht dann so aus:

In diesem Codelab lernen Sie das Grundprinzip für die Verwendung von Elementen mit unterschiedlichen Layouts in einem RecyclerView kennen. Ein gängiges Beispiel sind Header in Ihrer Liste oder Ihrem Raster. Eine Liste kann einen einzelnen Titel haben, um den Artikelinhalt zu beschreiben. Eine Liste kann auch mehrere Header enthalten, mit denen Elemente in einer einzelnen Liste gruppiert und getrennt werden.

RecyclerView weiß nichts über Ihre Daten oder darüber, welche Art von Layout die einzelnen Elemente haben. Unter „LayoutManager“ werden die Elemente auf dem Bildschirm selbst angeordnet, aber der Adapter passt die angezeigten Daten an und übergibt die Ansichtsinhaber an die RecyclerView. Sie fügen also den Code hinzu, um Header im Adapter zu erstellen.

Zwei Möglichkeiten, Header hinzuzufügen

In RecyclerView entspricht jedes Element in der Liste einer Indexnummer ab 0. Beispiel:

[Tatsächliche Daten] -> [Adapteransichten]

[0: SleepNight] -> [0: SleepNight]

[1: SleepNight] -> [1: SleepNight]

[2: SleepNight] -> [2: SleepNight]

Eine Möglichkeit, Header einer Liste hinzuzufügen, besteht darin, den Adapter so zu ändern, dass ein anderes ViewHolder-Element verwendet wird. Dazu prüfen Sie die Indexe, in denen der Header angezeigt werden muss. Die Adapter ist dafür verantwortlich, den Header zu verfolgen. Beispiel: Wenn oben in der Tabelle eine Kopfzeile angezeigt werden soll, müssen Sie eine andere ViewHolder für die Kopfzeile zurückgeben, während das Element mit null indexiert wird. Alle anderen Elemente werden mit dem Header-Offset wie unten dargestellt zugeordnet.

[Tatsächliche Daten] -> [Adapteransichten]

[0: Kopfzeile]

[0: SleepNight] -> [1: SleepNight]

[1: SleepNight] -> [2: SleepNight]

[2: SleepNight] -> [3: SleepNight.

Eine weitere Möglichkeit zum Hinzufügen von Headern ist es, das Back-up-Dataset für Ihr Datenraster zu ändern. Da alle Daten, die angezeigt werden sollen, in einer Liste gespeichert werden, können Sie die Liste so anpassen, dass auch die Elemente für eine Kopfzeile enthalten sind. Das ist zwar etwas einfacher zu verstehen, aber Sie müssen sich Gedanken darüber machen, wie Sie Ihre Objekte gestalten, damit Sie die verschiedenen Elementtypen in einer Liste zusammenfassen können. Wenn er so implementiert wird, werden die übergebenen Elemente im Adapter angezeigt. Das Element an Position 0 ist eine Überschrift und das Element an Position 1 ist ein SleepNight. Dadurch wird direkt der Bildschirminhalt zugeordnet.

[Tatsächliche Daten] -> [Adapteransichten]

[0: Header] -> [0: Header]

[1: SleepNight] -> [1: SleepNight]

[2: SleepNight] -> [2: SleepNight]

[3: SleepNight] -> [3: SleepNight]

Jede Methode hat Vor- und Nachteile. Wenn Sie das Dataset ändern, ändert sich nichts am restlichen Adaptercode. Sie können auch eine Headerlogik hinzufügen, indem Sie die Datenliste bearbeiten. Wenn Sie jedoch einen anderen ViewHolder verwenden, indem Sie die Indexe auf Header prüfen, haben Sie mehr Freiheiten für das Layout der Kopfzeile. Außerdem lässt sich mit dem Adapter steuern, wie Daten an die Ansicht angepasst werden, ohne die Sicherungsdaten zu ändern.

In diesem Codelab aktualisierst du RecyclerView dahingehend, dass am Anfang der Liste ein Header angezeigt wird. In diesem Fall verwendet Ihre App eine andere ViewHolder für den Header als für Datenelemente. Die App prüft den Index der Liste, um zu ermitteln, welche ViewHolder zu verwenden ist.

Schritt 1: DataItem-Klasse erstellen

Wenn Sie die Art des Elements abstrahieren und den Adapter einfach mit „items“ verarbeiten möchten, können Sie eine Klasse für Datenhalter erstellen, die entweder ein SleepNight oder ein Header darstellt. Das Dataset enthält dann eine Liste mit Elementen des Dateninhabers.

Sie können entweder die Starter-App von GitHub herunterladen oder die SleepTracker-App, die Sie im vorherigen Codelab erstellt haben, weiterhin verwenden.

  1. Laden Sie den Code RecyclerViewHeaders-Starter von GitHub herunter. Das Verzeichnis RecyclerViewHeaders-Starter enthält die Startversion der SleepTracker-App, die für dieses Codelab erforderlich ist. Wenn Sie möchten, können Sie auch mit der fertigen App aus dem vorherigen Codelab fortfahren.
  2. Öffnen Sie SleepNightAdapter.kt.
  3. Definieren Sie auf der obersten Ebene unter der Klasse SleepNightListener eine sealed-Klasse namens DataItem, die ein Datenelement darstellt.

    Eine sealed-Klasse definiert einen geschlossenen Typ. Das bedeutet, dass alle Unterklassen von DataItem in dieser Datei definiert sein müssen. Daher ist die Anzahl der Unterklassen dem Compiler bekannt. Für einen anderen Teil deines Codes ist es nicht möglich, einen neuen DataItem-Typ zu definieren, der deinen Adapter beschädigen könnte.
sealed class DataItem {

 }
  1. Definieren Sie innerhalb des DataItem-Klassens zwei Klassen, die die verschiedenen Arten von Datenelementen darstellen. Die erste ist eine SleepNightItem, ein Wrapper um eine SleepNight, sodass ein einzelner Wert namens sleepNight verwendet wird. Damit er Teil der versiegelten Klasse wird, muss sie DataItem erweitert werden.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
  1. Die zweite Klasse ist Header, um einen Header darzustellen. Da ein Header keine tatsächlichen Daten enthält, können Sie ihn als object deklarieren. Das bedeutet, dass es jeweils nur eine Instanz von Header geben wird. Lassen Sie sie noch einmal um DataItem verlängern.
object Header: DataItem()
  1. Definieren Sie innerhalb von DataItem auf Kursebene eine abstract-Long-Property namens id. Wenn der Adapter DiffUtil verwendet, um festzustellen, ob und wie ein Artikel geändert wurde, muss DiffItemCallback die ID des jeweiligen Artikels kennen. Es wird eine Fehlermeldung angezeigt, da SleepNightItem und Header die abstrakte Property id überschreiben müssen.
abstract val id: Long
  1. Überschreiben Sie in SleepNightItem id, um nightId zurückzugeben.
override val id = sleepNight.nightId
  1. Überschreiben Sie in Header id, um Long.MIN_VALUE zurückzugeben. Das ist eine sehr, sehr kleine Zahl (buchstaben -2 hoch 63). In Konflikt mit den vorhandenen nightId steht das also nicht in Konflikt.
override val id = Long.MIN_VALUE
  1. Der fertige Code sollte so aussehen und Ihre Anwendung sollte keine Fehler enthalten.
sealed class DataItem {
    abstract val id: Long
    data class SleepNightItem(val sleepNight: SleepNight): DataItem()      {
        override val id = sleepNight.nightId
    }

    object Header: DataItem() {
        override val id = Long.MIN_VALUE
    }
}

Schritt 2: ViewHolder für den Header erstellen

  1. Erstellen Sie das Layout für den Header in einer neuen Layoutressourcendatei namens header.xml, die ein TextView enthält. Das ist nicht besonders spannend, daher hier der Code.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Sleep Results"
    android:padding="8dp" />
  1. Extrahieren Sie "Sleep Results" in eine Stringressource und rufen Sie sie header_text auf.
<string name="header_text">Sleep Results</string>
  1. Erstellen Sie in SleepNightAdapter.kt in SleepNightAdapter über der Klasse ViewHolder eine neue TextViewHolder-Klasse. Diese Klasse erhöht die Aufteilung von textview.xml und gibt eine TextViewHolder-Instanz zurück. Da du dies zuvor getan hast, siehst du hier den Code und du musst View und R importieren:
    class TextViewHolder(view: View): RecyclerView.ViewHolder(view) {
        companion object {
            fun from(parent: ViewGroup): TextViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val view = layoutInflater.inflate(R.layout.header, parent, false)
                return TextViewHolder(view)
            }
        }
    }

Schritt 3: SleepNightAdapter aktualisieren

Als Nächstes müssen Sie die Erklärung von SleepNightAdapter aktualisieren. Anstelle von nur einem Typ von ViewHolder muss es in der Lage sein, alle Arten von Ansichtsinhabern zu verwenden.

Elementtypen definieren

  1. Definieren Sie in SleepNightAdapter.kt auf oberster Ebene unter den import-Anweisungen und über SleepNightAdapter zwei Konstanten für die Ansichtstypen.

    RecyclerView muss die Ansichtselemente jedes Elements unterscheiden, damit ihm ein Aufrufinhaber zugewiesen werden kann.
    private val ITEM_VIEW_TYPE_HEADER = 0
    private val ITEM_VIEW_TYPE_ITEM = 1
  1. Erstellen Sie innerhalb der SleepNightAdapter eine Funktion, mit der getItemViewType() überschrieben wird, um je nach Typ des aktuellen Elements den rechten Header oder die Konstante für den Artikel zurückzugeben.
override fun getItemViewType(position: Int): Int {
        return when (getItem(position)) {
            is DataItem.Header -> ITEM_VIEW_TYPE_HEADER
            is DataItem.SleepNightItem -> ITEM_VIEW_TYPE_ITEM
        }
    }

Definition der SleepNightAdapter-Definition

  1. Aktualisieren Sie in der Definition von SleepNightAdapter das erste Argument für ListAdapter von SleepNight in DataItem.
  2. Ändern Sie in der Definition von SleepNightAdapter das zweite allgemeine Argument für ListAdapter von SleepNightAdapter.ViewHolder zu RecyclerView.ViewHolder. Ihnen werden einige Fehler für erforderliche Aktualisierungen angezeigt und Ihre Kursüberschrift sollte wie unten dargestellt aussehen.
class SleepNightAdapter(val clickListener: SleepNightListener):
       ListAdapter<DataItem, RecyclerView.ViewHolder>(SleepNightDiffCallback()) {

onCreateViewHolder() aktualisieren

  1. Ändern Sie die Signatur von onCreateViewHolder(), um ein RecyclerView.ViewHolder zurückzugeben.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
  1. Erweitern Sie die Implementierung der onCreateViewHolder()-Methode, um zu testen und den richtigen Aufrufinhaber für jeden Elementtyp zurückzugeben. Die aktualisierte Methode sollte so aussehen:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            ITEM_VIEW_TYPE_HEADER -> TextViewHolder.from(parent)
            ITEM_VIEW_TYPE_ITEM -> ViewHolder.from(parent)
            else -> throw ClassCastException("Unknown viewType ${viewType}")
        }
    }

onBindViewHolder() aktualisieren

  1. Ändern Sie den Parametertyp onBindViewHolder() von ViewHolder in RecyclerView.ViewHolder.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
  1. Fügen Sie eine Bedingung hinzu, um nur dem Inhaber der Ansicht Daten zuzuweisen, wenn der Inhaber ein ViewHolder ist.
        when (holder) {
            is ViewHolder -> {...}
  1. Übergeben Sie den von getItem() zurückgegebenen Objekttyp an DataItem.SleepNightItem. Die fertige onBindViewHolder()-Funktion sollte so aussehen.
  override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is ViewHolder -> {
                val nightItem = getItem(position) as DataItem.SleepNightItem
                holder.bind(nightItem.sleepNight, clickListener)
            }
        }
    }

diffUtil-Callbacks aktualisieren

  1. Ändere die Methode in SleepNightDiffCallback, um die neue DataItem-Klasse anstelle der SleepNight zu verwenden. Unterdrücken Sie die Lint-Warnung wie im Code unten.
class SleepNightDiffCallback : DiffUtil.ItemCallback<DataItem>() {
    override fun areItemsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
        return oldItem.id == newItem.id
    }
    @SuppressLint("DiffUtilEquals")
    override fun areContentsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
        return oldItem == newItem
    }
}

Header hinzufügen und einreichen

  1. Definieren Sie innerhalb der SleepNightAdapter unter onCreateViewHolder() eine Funktion addHeaderAndSubmitList() wie unten dargestellt. Diese Funktion verwendet eine Liste von SleepNight. Anstatt die durch ListAdapter bereitgestellte submitList() zu verwenden, können Sie beim Einreichen Ihrer Liste mit dieser Funktion eine Kopfzeile hinzufügen und die Liste dann einreichen.
fun addHeaderAndSubmitList(list: List<SleepNight>?) {}
  1. Wenn die übergebene Liste null ist, geben Sie in addHeaderAndSubmitList() nur einen Header zurück, andernfalls den Header am Anfang der Liste und anschließend die Liste.
val items = when (list) {
                null -> listOf(DataItem.Header)
                else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
            }
submitList(items)
  1. Öffnen Sie SleepTrackerFragment.kt und ändern Sie den Aufruf von submitList() in addHeaderAndSubmitList().
  1. Führen Sie Ihre App aus und beobachten Sie, wie die Kopfzeile als erstes Element in der Liste der Schlafelemente angezeigt wird.

Es müssen zwei Dinge korrigiert werden. Das eine ist sichtbar und das andere nicht.

  • Die Kopfzeile wird oben links angezeigt und ist nicht leicht zu unterscheiden.
  • Bei einer kurzen Liste mit einem Header spielt es keine Rolle, aber Sie sollten in addHeaderAndSubmitList() im UI-Thread keine Listenbearbeitungen vornehmen. Stellen Sie sich eine Liste mit Hunderten von Elementen, mehreren Überschriften und Logik vor, um zu entscheiden, wo Elemente eingefügt werden müssen. Diese Arbeit gehört einem Koroutin.

Ändern Sie die Einstellungen von addHeaderAndSubmitList() so, dass Koroutinen verwendet werden:

  1. Definieren Sie auf oberster Ebene innerhalb der SleepNightAdapter-Klasse eine CoroutineScope mit Dispatchers.Default.
private val adapterScope = CoroutineScope(Dispatchers.Default)
  1. Starten Sie in addHeaderAndSubmitList() eine Koroutine im adapterScope, um die Liste zu ändern. Wechseln Sie dann zum Dispatchers.Main-Kontext, um die Liste einzureichen, wie im Code unten zu sehen ist.
 fun addHeaderAndSubmitList(list: List<SleepNight>?) {
        adapterScope.launch {
            val items = when (list) {
                null -> listOf(DataItem.Header)
                else -> listOf(DataItem.Header) + list.map { DataItem.SleepNightItem(it) }
            }
            withContext(Dispatchers.Main) {
                submitList(items)
            }
        }
    }
  1. Dein Code sollte sich nun erstellen und ausführen lassen und du erhältst keinen Unterschied.

Aktuell hat die Kopfzeile dieselbe Breite wie die anderen Elemente im Raster. Sie umfasst eine Spanne horizontal und vertikal. Das gesamte Raster passt drei Elemente mit einer Spannweite horizontal, sodass die Kopfzeile horizontal drei Spannen horizontal verwenden sollte.

Zum Korrigieren der Kopfzeilengröße müssen Sie GridLayoutManager mitteilen, wann die Daten in allen Spalten eingeschlossen werden sollen. Dazu kannst du SpanSizeLookup in einer GridLayoutManager konfigurieren. Dies ist ein Konfigurationsobjekt, mit dem GridLayoutManager ermittelt, wie viele Spans für jedes Element in der Liste verwendet werden sollen.

  1. Öffnen Sie die Datei SleepTrackerFragment.kt.
  2. Suchen Sie den Code, der für manager definiert ist, am Ende von onCreateView().
val manager = GridLayoutManager(activity, 3)
  1. Definieren Sie unter manager wie manager.spanSizeLookup. object muss erstellt werden, weil setSpanSizeLookup kein Lammda übernimmt. Um eine object in Kotlin zu erstellen, geben Sie object : classname ein, in diesem Fall GridLayoutManager.SpanSizeLookup.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
  1. Möglicherweise wird ein Compiler-Fehler zum Aufrufen des Konstruktors angezeigt. Falls ja, öffne das Intent-Menü mit Option+Enter (Mac) oder Alt+Enter (Windows), um den Konstruktoraufruf auszuführen.
  1. Sie erhalten dann in object eine Fehlermeldung, dass Sie Methoden überschreiben müssen. Bewegen Sie den Cursor auf object, drücken Sie Option+Enter (Mac) oder Alt+Enter (Windows), um das Intent-Menü zu öffnen, und überschreiben Sie dann die Methode getSpanSize().
  1. Gib im Text von getSpanSize() für jede Position die richtige Span-Größe zurück. Position 0 hat eine Spannengröße von 3 und die anderen Positionen haben eine Spannengröße von 1. Der fertige Code sollte so aussehen:
    manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int) =  when (position) {
                0 -> 3
                else -> 1
            }
        }
  1. Um den Header zu optimieren, öffnen Sie header.xml und fügen Sie diesen Code in die Layoutdatei header.xml ein.
android:textColor="@color/white_text_color"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@color/colorAccent"
  1. Führe deine App aus. Sie sollte dem folgenden Screenshot entsprechen.

Glückwunsch! Fertig!

Android Studio-Projekt: RecyclerViewHeaders

  • Ein Header ist in der Regel ein Element, das die Breite einer Liste einnimmt und als Titel oder Trennzeichen dient. Eine Liste kann einen einzelnen Titel haben, um den Inhalt der Artikel zu beschreiben, oder mehrere Titel, um Artikel zu gruppieren und voneinander zu trennen.
  • Für eine Anzeige (RecyclerView) können mehrere Ansichtshalter verwendet werden, um heterogene Elemente wie Header und Listenelemente zu verarbeiten.
  • Eine Möglichkeit, Header hinzuzufügen, besteht darin, den Adapter so zu ändern, dass ein anderes ViewHolder-Element verwendet wird. Prüfen Sie dazu die Indexe, in denen der Header angezeigt werden muss. Die Adapter ist dafür verantwortlich, den Header zu verfolgen.
  • Eine weitere Möglichkeit zum Hinzufügen von Headern ist es, das Back-up-Dataset (die Liste) für Ihr Datenraster zu bearbeiten. Gehen Sie dabei genauso vor wie in diesem Codelab.

Das sind die wichtigsten Schritte zum Hinzufügen eines Headers:

  • Zusammenfassung der Daten in der Liste durch Erstellen einer DataItem, die einen Header oder Daten enthalten kann
  • Erstellen Sie einen Halter mit einem Layout für die Kopfzeile im Adapter.
  • Aktualisieren Sie den Adapter und seine Methoden, um RecyclerView.ViewHolder zu verwenden.
  • Geben Sie in onCreateViewHolder() den korrekten Typ des Aufrufhalters für das Datenelement zurück.
  • Aktualisiere SleepNightDiffCallback, um mit der Klasse DataItem zu arbeiten.
  • Erstellen Sie eine addHeaderAndSubmitList()-Funktion, die Koroutinen verwendet, um den Header dem Dataset hinzuzufügen und dann submitList() aufzurufen.
  • Implementieren Sie GridLayoutManager.SpanSizeLookup(), um nur die Kopfzeilen zu erweitern.

Udacity-Kurs:

Android-Entwicklerdokumentation:

In diesem Abschnitt werden mögliche Hausaufgaben für Schüler oder Studenten aufgeführt, die an diesem von einem Kursleiter geleiteten Codelab arbeiten. Die Lehrkraft kann Folgendes tun:

  • Bei Bedarf können Sie die entsprechenden Aufgaben zuweisen.
  • Schülern mitteilen, wie sie Aufgaben für die Aufgabe abgeben
  • Benoten Sie die Hausaufgaben.

Lehrkräfte können diese Vorschläge so oft oder so oft verwenden, wie sie möchten. anderen Aufgaben können sie nach Belieben zugewiesen werden.

Wenn Sie alleine an diesem Codelab arbeiten, können Sie Ihr Wissen mit diesen Hausaufgaben testen.

Diese Fragen beantworten

Frage 1

Welche der folgenden Aussagen über ViewHolder trifft zu?

weil ein Adapter mehrere ViewHolder-Klassen nutzen kann, um Header und verschiedene Datentypen aufzunehmen.

▢ Es kann genau ein Aufrufer für die Daten und ein Aufrufer für eine Kopfzeile geben.

▢ Ein RecyclerView unterstützt mehrere Arten von Headern, die Daten müssen jedoch einheitlich sein.

▢ Beim Hinzufügen eines Headers setzen Sie eine Unterklasse für RecyclerView, um den Header an der richtigen Position einzufügen.

Frage 2

Wann solltest du Koroutinen mit einer RecyclerView verwenden? Wählen Sie alle Aussagen aus, die wahr sind.

▢ Nie. Ein RecyclerView ist ein UI-Element und sollte nicht Koroutinen verwenden.

▢ Korreliere bei lang andauernden Aufgaben, die die Benutzeroberfläche verlangsamen könnten.

▢.

▢ Sie können Koroutinen mit Sperrfunktionen verwenden, um das Blockieren des Haupt-Threads zu vermeiden.

Frage 3

Was musst du NICHT tun, wenn du mehr als ein ViewHolder verwendest?

▢ In ViewHolder kannst du Dateien mit mehreren Layoutdateien auffüllen, falls nötig.

▢ In onCreateViewHolder(): Gibt den korrekten Typ des Aufrufhalters für das Datenelement zurück.

▢ In onBindViewHolder(): Binde die Daten nur, wenn der Eigentümer der Datenansicht der richtige Eigentümer für das Datenelement ist.

▢ Verknüpfe die Adapterklassenklasse, um beliebige RecyclerView.ViewHolder zu akzeptieren.

Beginnen Sie mit der nächsten Lektion: 8.1 Daten aus dem Internet herunterladen

Links zu anderen Codelabs in diesem Kurs finden Sie auf der Landingpage zu Kotlin-Grundlagen für Android.