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 einemAdapter
-,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
mitRecyclerView
verwenden, um Elemente mit einem anderen Layout hinzuzufügen? Hier erfahren Sie, wie Sie mit einem zweitenViewHolder
über den inRecyclerView
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.
- 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.
- Öffnen Sie SleepNightAdapter.kt.
- Definieren Sie auf der obersten Ebene unter der Klasse
SleepNightListener
einesealed
-Klasse namensDataItem
, die ein Datenelement darstellt.
Einesealed
-Klasse definiert einen geschlossenen Typ. Das bedeutet, dass alle Unterklassen vonDataItem
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 neuenDataItem
-Typ zu definieren, der deinen Adapter beschädigen könnte.
sealed class DataItem {
}
- Definieren Sie innerhalb des
DataItem
-Klassens zwei Klassen, die die verschiedenen Arten von Datenelementen darstellen. Die erste ist eineSleepNightItem
, ein Wrapper um eineSleepNight
, sodass ein einzelner Wert namenssleepNight
verwendet wird. Damit er Teil der versiegelten Klasse wird, muss sieDataItem
erweitert werden.
data class SleepNightItem(val sleepNight: SleepNight): DataItem()
- Die zweite Klasse ist
Header
, um einen Header darzustellen. Da ein Header keine tatsächlichen Daten enthält, können Sie ihn alsobject
deklarieren. Das bedeutet, dass es jeweils nur eine Instanz vonHeader
geben wird. Lassen Sie sie noch einmal umDataItem
verlängern.
object Header: DataItem()
- Definieren Sie innerhalb von
DataItem
auf Kursebene eineabstract
-Long
-Property namensid
. Wenn der AdapterDiffUtil
verwendet, um festzustellen, ob und wie ein Artikel geändert wurde, mussDiffItemCallback
die ID des jeweiligen Artikels kennen. Es wird eine Fehlermeldung angezeigt, daSleepNightItem
undHeader
die abstrakte Propertyid
überschreiben müssen.
abstract val id: Long
- Überschreiben Sie in
SleepNightItem
id
, umnightId
zurückzugeben.
override val id = sleepNight.nightId
- Überschreiben Sie in
Header
id
, umLong.MIN_VALUE
zurückzugeben. Das ist eine sehr, sehr kleine Zahl (buchstaben -2 hoch 63). In Konflikt mit den vorhandenennightId
steht das also nicht in Konflikt.
override val id = Long.MIN_VALUE
- 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
- 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" />
- Extrahieren Sie
"Sleep Results"
in eine Stringressource und rufen Sie sieheader_text
auf.
<string name="header_text">Sleep Results</string>
- Erstellen Sie in SleepNightAdapter.kt in
SleepNightAdapter
über der KlasseViewHolder
eine neueTextViewHolder
-Klasse. Diese Klasse erhöht die Aufteilung von textview.xml und gibt eineTextViewHolder
-Instanz zurück. Da du dies zuvor getan hast, siehst du hier den Code und du musstView
undR
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
- Definieren Sie in
SleepNightAdapter.kt
auf oberster Ebene unter denimport
-Anweisungen und überSleepNightAdapter
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
- Erstellen Sie innerhalb der
SleepNightAdapter
eine Funktion, mit dergetItemViewType()
ü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
- Aktualisieren Sie in der Definition von
SleepNightAdapter
das erste Argument fürListAdapter
vonSleepNight
inDataItem
. - Ändern Sie in der Definition von
SleepNightAdapter
das zweite allgemeine Argument fürListAdapter
vonSleepNightAdapter.ViewHolder
zuRecyclerView.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
- Ändern Sie die Signatur von
onCreateViewHolder()
, um einRecyclerView.ViewHolder
zurückzugeben.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
- 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
- Ändern Sie den Parametertyp
onBindViewHolder()
vonViewHolder
inRecyclerView.ViewHolder
.
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
- Fügen Sie eine Bedingung hinzu, um nur dem Inhaber der Ansicht Daten zuzuweisen, wenn der Inhaber ein
ViewHolder
ist.
when (holder) {
is ViewHolder -> {...}
- Übergeben Sie den von
getItem()
zurückgegebenen Objekttyp anDataItem.SleepNightItem
. Die fertigeonBindViewHolder()
-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
- Ändere die Methode in
SleepNightDiffCallback
, um die neueDataItem
-Klasse anstelle derSleepNight
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
- Definieren Sie innerhalb der
SleepNightAdapter
unteronCreateViewHolder()
eine FunktionaddHeaderAndSubmitList()
wie unten dargestellt. Diese Funktion verwendet eine Liste vonSleepNight
. Anstatt die durchListAdapter
bereitgestelltesubmitList()
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>?) {}
- Wenn die übergebene Liste
null
ist, geben Sie inaddHeaderAndSubmitList()
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)
- Öffnen Sie SleepTrackerFragment.kt und ändern Sie den Aufruf von
submitList()
inaddHeaderAndSubmitList()
.
- 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:
- Definieren Sie auf oberster Ebene innerhalb der
SleepNightAdapter
-Klasse eineCoroutineScope
mitDispatchers.Default
.
private val adapterScope = CoroutineScope(Dispatchers.Default)
- Starten Sie in
addHeaderAndSubmitList()
eine Koroutine imadapterScope
, um die Liste zu ändern. Wechseln Sie dann zumDispatchers.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)
}
}
}
- 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.
- Öffnen Sie die Datei SleepTrackerFragment.kt.
- Suchen Sie den Code, der für
manager
definiert ist, am Ende vononCreateView()
.
val manager = GridLayoutManager(activity, 3)
- Definieren Sie unter
manager
wiemanager.spanSizeLookup
.object
muss erstellt werden, weilsetSpanSizeLookup
kein Lammda übernimmt. Um eineobject
in Kotlin zu erstellen, geben Sieobject : classname
ein, in diesem FallGridLayoutManager.SpanSizeLookup
.
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
}
- Möglicherweise wird ein Compiler-Fehler zum Aufrufen des Konstruktors angezeigt. Falls ja, öffne das Intent-Menü mit
Option+Enter
(Mac) oderAlt+Enter
(Windows), um den Konstruktoraufruf auszuführen.
- Sie erhalten dann in
object
eine Fehlermeldung, dass Sie Methoden überschreiben müssen. Bewegen Sie den Cursor aufobject
, drücken SieOption+Enter
(Mac) oderAlt+Enter
(Windows), um das Intent-Menü zu öffnen, und überschreiben Sie dann die MethodegetSpanSize()
.
- 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
}
}
- 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"
- 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. DieAdapter
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 KlasseDataItem
zu arbeiten. - Erstellen Sie eine
addHeaderAndSubmitList()
-Funktion, die Koroutinen verwendet, um den Header dem Dataset hinzuzufügen und dannsubmitList()
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:
Links zu anderen Codelabs in diesem Kurs finden Sie auf der Landingpage zu Kotlin-Grundlagen für Android.