RecyclerView
ist eine Ansichtskomponente, mit der sich ganz einfach
große Datenmengen. Anstatt für jeden Artikel im Datensatz Ansichten zu erstellen, verbessert RecyclerView
die Leistung Ihrer App, indem ein kleiner Pool von Ansichten beibehalten und beim Scrollen durch die Artikel wiederverwendet wird.
In „Schreiben“ können Sie auch Lazy Listen verwenden, um dasselbe Ziel zu erreichen. Diese Seite
wird beschrieben, wie Sie Ihre RecyclerView
-Implementierung zur Verwendung von Lazy-Listen migrieren können.
in „Schreiben“.
Migrationsschritte
So migrieren Sie Ihre RecyclerView
-Implementierung zu Compose:
Kommentieren oder entfernen Sie
RecyclerView
aus Ihrer UI-Hierarchie und fügen Sie einComposeView
, um ihn zu ersetzen, wenn in der Hierarchie noch keiner vorhanden ist. Dies ist der Container für die Lazy-Liste, die Sie hinzufügen:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
Bestimmen Sie anhand der Layoutmanager von
RecyclerView
(siehe Tabelle unten) Das ausgewählte Composeable ist das Composeable der obersten Ebene derComposeView
, die Sie im vorherigen Schritt hinzugefügt haben.LayoutManager
Zusammensetzbar
LinearLayoutManager
LazyColumn
oderLazyRow
GridLayoutManager
LazyVerticalGrid
oderLazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
oderLazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Erstellen Sie für jeden Ansichtstyp in Ihrer
RecyclerView.Adapter
-Implementierung ein entsprechendes Composeable. Jeder Ansichtstyp wird in der Regel einerViewHolder
abgeleitet. Dies ist jedoch nicht immer der Fall. Diese Composeables werden als UI-Darstellung für verschiedene Arten von Elementen in Ihrer Liste verwendet:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
Die Logik in den Methoden
onCreateViewHolder()
undonBindViewHolder()
IhrerRecyclerView.Adapter
wird durch diese Composeables und den von Ihnen angegebenen Status ersetzt. In „Schreiben“ gibt es keine Trennung zwischen Sie erstellen eine zusammensetzbare Funktion für ein Element und binden Daten daran. Diese Konzepte sind zusammengeführt werden.Verwenden Sie im
content
-Steckplatz der Lazy-Liste (der abschließende Lambdaparameter) die Funktionitems()
(oder eine entsprechende Überladung), um die Daten für die Liste zu durchlaufen. Rufe in deritemContent
-Lambda-Funktion das entsprechende zusammensetzbare Element für deine Daten auf:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Gängige Anwendungsfälle
Artikeldekorationen
RecyclerView
hat das Konzept eines ItemDecoration
, mit dem Sie einen
spezielle Zeichnung für Elemente in der Liste. Sie können beispielsweise eine
ItemDecoration
, um Trennlinien zwischen Elementen hinzuzufügen:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
In Compose gibt es kein entsprechendes Konzept für Artikeldekorationen. Stattdessen müssen Sie
können der Liste beliebige UI-Dekorationen direkt in der Komposition hinzufügen. Beispiel:
Um der Liste Trennlinien hinzuzufügen, können Sie nach jedem Teil die zusammensetzbare Funktion Divider
verwenden
Artikel:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Elementanimationen
Auf einem RecyclerView
kann ein ItemAnimator
festgelegt werden, um die Darstellung von
wenn Änderungen am Adapter vorgenommen werden. Standardmäßig wird in RecyclerView
DefaultItemAnimator
verwendet, das grundlegende Animationen für die Ereignisse „Entfernen“, „Hinzufügen“ und „Verschieben“ bietet.
Das Konzept von Lazy-Listen ähnelt dem animateItemPlacement
-Modifikator.
Weitere Informationen finden Sie unter Artikelanimationen.
Weitere Informationen
Weitere Informationen zur Migration eines RecyclerView
zu Compose finden Sie in der
folgenden Ressourcen:
- Listen und Raster: Dokumentation zur Implementierung von Listen und Rastern in Compose
- Jetpack Compose Interop: Using Compose in a RecyclerView:
Blogpost zur effizienten Verwendung von Compose in einem
RecyclerView
.
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Listen und Raster
CoordinatorLayout
zu Compose migrieren- Weitere Hinweise