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
Eine der wichtigsten Stärken von RecyclerView
ist, dass du damit deine Layoutstrategie steuern und anpassen kannst. Mithilfe von LayoutManager
wird festgelegt, wie die Elemente im RecyclerView
angeordnet sind.
RecyclerView
verfügt über vorkonfigurierte Layoutmanager für gängige Anwendungsfälle. Du kannst beispielsweise LinearLayout
für horizontale und vertikale Listen oder GridLayout
für Raster verwenden. Für kompliziertere Anwendungsfälle musst du ein benutzerdefiniertes LayoutManager
-Objekt implementieren.
In diesem Codelab lernen Sie, wie Sie Daten in einem Rasterlayout anstelle einer Liste anzeigen – auf Grundlage der Schlaf-Tracker-App aus dem vorherigen Codelab. Wenn Sie die App aus dem vorherigen Codelab nicht haben, können Sie den Startcode für dieses Codelab herunterladen.
Was Sie bereits wissen sollten
Sie sollten mit Folgendem vertraut sein:
- Einfache Benutzeroberfläche mit
Activity
,Fragments
undViews
erstellen - Zwischen Fragmenten wechseln und
safeArgs
verwenden, um Daten zwischen Fragmenten zu übergeben - Modelle ansehen, Modellfabriken und Transformationen ansehen
LiveData
und ihre BetrachterRoom
-Datenbank, DAO und Entitäten erstellen- Koroutinen für Datenbankaufgaben und andere lang andauernde Aufgaben verwenden
- Einfache
RecyclerView
mit einemAdapter
-,ViewHolder
- und Elementlayout implementieren - Datenbindung für
RecyclerView
implementieren - Bindungsadapter für die Transformation von Daten erstellen und verwenden
Lerninhalte
- So kannst du andere
LayoutManager
verwenden, um die Anzeige deiner Daten inRecyclerView
zu ändern - So erstellen Sie ein Rasterlayout für Ihre Schlafdaten
Aufgaben
- Baue auf der Schlaf-Tracker-App aus dem vorherigen Codelab dieser Serie auf.
- Ersetze die Liste, die von der
RecyclerView
in der App angezeigt wird, durch ein Raster mit Schlafdaten.
Die Schlaf-Tracker-App hat zwei 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. Auf dem zweiten Bildschirm rechts wird die Qualität des Schlafs angezeigt.
Diese App verwendet eine vereinfachte Architektur mit einem UI-Controller, Modell ansehen und LiveData
sowie eine Room
-Datenbank, um Schlafdaten zu speichern.
Die Schlafdaten werden in RecyclerView
angezeigt. In diesem Codelab änderst du die App zu GridLayout
. Der letzte Bildschirm sieht wie der folgende Screenshot aus.
Als du in einem vorherigen Codelab das RecyclerView
zu fragment_sleep_tracker.xml
hinzugefügt hast, hast du ohne Änderungen ein LinearLayoutManager
hinzugefügt. Dieser Code zeigt die Daten als vertikale Liste an.
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
LinearLayoutManager
ist der gängigste und unkomplizierte Layout-Manager für RecyclerView
und unterstützt sowohl die horizontale als auch die vertikale Platzierung von untergeordneten Ansichten. Du kannst beispielsweise mit LinearLayoutManager
ein Karussell mit Bildern erstellen, in dem der Nutzer horizontal scrollt.
Rasterlayout
Ein weiterer häufiger Anwendungsfall besteht darin, dem Nutzer eine Menge Daten anzuzeigen. Sie können dies mithilfe von GridLayout
tun. Mit GridLayoutManager
für RecyclerView
werden die Daten als scrollbares Raster dargestellt, wie unten dargestellt.
Aus Sicht des Designes eignet sich GridLayout
am besten für Listen, die als Symbole oder Bilder dargestellt werden können, z. B. Listen in einer Foto-App. In der Schlaf-Tracker-App könnte jede Nacht des Schlafs als Raster großer Symbole dargestellt werden. So sieht der Nutzer auf einen Blick, wie gut du geschlafen hast.
Rasterlayout von Elementen
In GridLayout
werden Elemente in einem Raster aus Zeilen und Spalten angeordnet. Standardmäßig wird angenommen, dass jedes Element in einer Reihe ein "span&t In diesem Fall entspricht ein Span der Breite einer Spalte.
In den ersten beiden Beispielen unten ist jede Zeile aus drei Spannen bestehen. Standardmäßig gibt GridLayoutManager
jedes Element in einem Span an, bis die Span-Anzahl wie angegeben angegeben wird. Wenn die Spanne erreicht ist, wird sie zur nächsten Zeile umgebrochen.
Standardmäßig nimmt jedes Element eine Spanne ein, Sie können aber ein Element breiter machen, indem Sie angeben, wie viele Spannen belegt werden sollen. Das oberste Element auf dem Bildschirm ganz rechts (siehe unten) umfasst beispielsweise drei Spans.
Für diese Aufgabe führen Sie den RecyclerView
aus, den Sie in der letzten Übung abgeschlossen haben, um sie mithilfe eines GridLayoutManager
s anzuzeigen. Sie können die Schlaf-Tracker-App aus dem vorherigen Codelab weiterhin verwenden oder die RecyclerViewGridLayout-Starter App von GitHub herunterladen.
Schritt 1: LayoutManager ändern
- Laden Sie bei Bedarf die App RecyclerViewGridLayout-Starter für dieses Codelab von GitHub herunter und öffnen Sie das Projekt in Android Studio.
- Öffne die
fragment_sleep_tracker.xml
-Layoutdatei. - Entferne den Layoutmanager aus der Definition des
sleep_list
RecyclerView
.
Code, der gelöscht werden soll:
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager
- Öffnen Sie
SleepTrackerFragment.kt
. - Erstellen Sie in
OnCreateView()
unmittelbar vor derreturn
-Anweisung eine neue vertikaleGridLayoutManager
-Ansicht mit drei Spans von oben nach unten.
DerGridLayoutManager
-Konstruktor kann bis zu vier Argumente verwenden: einen Kontext, also dieactivity
, die Anzahl der Spans (Spalten im Standard-Vertikallayout), eine Ausrichtung (Standard ist vertikal) und ob das umgekehrte Layout ist (Standard istfalse
).
val manager = GridLayoutManager(activity, 3)
- Unterhalb dieser Zeile kannst du die
RecyclerView
bitten, dieseGridLayoutManager
zu verwenden.RecyclerView
befindet sich im Bindungsobjekt und heißtsleepList
. (Siehefragment_sleep_tracker.xml
.)
binding.sleepList.layoutManager = manager
Schritt 2: Layout ändern
Das aktuelle Layout in list_item_sleep_night.xml
zeigt die Daten an, indem es eine ganze Zeile pro Nacht verwendet. In diesem Schritt legen Sie ein kompakteres Layout für ein quadratisches Element für das Raster fest.
- Öffnen Sie
list_item_sleep_night.xml
. - Lösche die
TextView
fürsleep_length
, weil das neue Design sie nicht benötigt. - Verschieben Sie das
TextView
-Objekt vonquality_string
so, dass es unter demImageView
angezeigt wird. Dazu müssen Sie einige Dinge aktualisieren. Hier ist das endgültige Layout für dieTextView
vonquality_string
:
<TextView
android:id="@+id/quality_string"
android:layout_width="0dp"
android:layout_height="20dp"
android:textAlignment="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/quality_image"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/quality_image"
app:layout_constraintTop_toBottomOf="@+id/quality_image"
tools:text="Excellent!!!"
app:sleepQualityString="@{sleep}" />
- Stellen Sie in der Designansicht sicher, dass sich der
quality_string
TextView
unter demImageView
befindet.
Da Sie die Datenbindung verwendet haben, müssen Sie nichts in der Adapter
ändern. Der Code sollte einfach funktionieren und Ihre Liste sollte als Raster dargestellt werden.
- Führe die App aus und beobachte, wie die Schlafdaten in einem Raster angezeigt werden.
Beachten Sie, dassConstraintLayout
weiterhin die gesamte Breite einnimmt.GridLayoutManager
weist Ihrer Ansicht basierend auf ihrer Spanne eine feste Breite zu.GridLayoutManager
ist bestrebt, alle Einschränkungen beim Gestalten des Rasters zu erfüllen und Leerzeichen oder Clips hinzuzufügen.
- Ändern Sie in
SleepTrackerFragment
im Code, derGridLayoutManager
erstellt, die Anzahl der Spannen fürGridLayoutManger
in 1. Führen Sie die App aus. Sie erhalten eine Liste.
val manager = GridLayoutManager(activity, 1)
- Ändern Sie die Anzahl der Spannen für
GridLayoutManager
in 10 und führen Sie die App aus. Beachten Sie, dass dasGridLayoutManager
in 10 aufeinanderfolgenden Elementen passt, aber die Elemente jetzt gekürzt werden. - Ändern Sie die Anzahl der Spannen in 5 und die Richtung in
GridLayoutManager.VERTICAL
. Führen Sie die App aus und beachten Sie, dass Sie horizontal scrollen können. Sie benötigen hierfür ein anderes Layout.
val manager = GridLayoutManager(activity, 5, GridLayoutManager.HORIZONTAL, false)
- Vergessen Sie nicht, die Spanne zurück auf 3 und die Ausrichtung auf vertikal zu setzen.
Android Studio-Projekt: RecyclerViewGridLayout
- Layoutmanager verwalten die Anordnung der Elemente im
RecyclerView
. RecyclerView
enthält vorkonfigurierte Layoutmanager für häufige Anwendungsfälle wie eine horizontale und eine vertikale Liste undLinearLayout
für Raster.- Für kompliziertere Anwendungsfälle solltest du ein benutzerdefiniertes
LayoutManager
-Objekt implementieren. - Aus Designsicht eignet sich
GridLayout
am besten für Listen von Elementen, die als Symbole oder Bilder dargestellt werden können. - In
GridLayout
werden Elemente in einem Raster aus Zeilen und Spalten angeordnet. Bei vertikalem Scrollen verwendet jedes Element in einer Reihe die sogenannte „Spannung“. - Sie können anpassen, wie viele Spannen ein Element in Anspruch nimmt. So lassen sich interessante Raster erstellen, ohne dass ein benutzerdefinierter Layoutmanager erforderlich ist.
- Erstellen Sie ein Elementlayout für ein Element im Raster. Der Layoutmanager übernimmt die Anordnung.
- Du kannst
LayoutManager
fürRecyclerView
entweder in der XML-Layoutdatei mit dem<RecyclerView>
-Element oder programmatisch festlegen.
Udacity-Kurse:
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 Antworten sind Layout-Manager von Android? Wählen Sie alle zutreffenden Antworten aus.
▢ LinearLayouManager
▢ GridLayoutManager
▢ CircularLayoutManager
▢ StaggeredGridLayoutManager
Frage 2
Was ist „spant“?
▢: Die Größe eines von GridLayoutManager
erstellten Rasters.
▢ Die Breite einer Spalte im Raster.
▢ Abmessungen eines Elements in einem Raster.
▢: Die Anzahl der Spalten in einem Raster mit vertikaler Ausrichtung
Beginnen Sie mit der nächsten Lektion: