RecyclerView
ist eine View-Komponente, mit der sich große Datasets effizient darstellen lassen. Anstatt Ansichten für jedes Element im Datensatz zu erstellen, verbessert RecyclerView
die Leistung Ihrer App, indem ein kleiner Pool von Ansichten beibehalten und wiederverwendet wird, wenn Sie durch die Elemente scrollen.
In Compose können Sie Lazy Lists verwenden, um dasselbe zu erreichen. Auf dieser Seite wird beschrieben, wie Sie Ihre RecyclerView
-Implementierung migrieren, um Lazy Lists in Compose zu verwenden.
Migrationsschritte
So migrieren Sie Ihre RecyclerView
-Implementierung zu Compose:
Kommentieren Sie das
RecyclerView
in Ihrer UI-Hierarchie aus oder entfernen Sie es und fügen Sie einComposeView
hinzu, um es zu ersetzen, falls noch keines in der Hierarchie vorhanden ist. Dies ist der Container für die Lazy List, 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>
Legen Sie anhand des Layout-Managers von
RecyclerView
fest, welche Art von Lazy-List-Composable Sie benötigen (siehe Tabelle unten). Das ausgewählte Composable ist das Composable der obersten Ebene desComposeView
, das Sie im vorherigen Schritt hinzugefügt haben.LayoutManager
Composable
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 Composable. Jeder Ansichtstyp wird in der Regel einerViewHolder
-Unterklasse zugeordnet. Das ist jedoch nicht immer der Fall. Diese Composables 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()
vonRecyclerView.Adapter
wird durch diese Composables und den von Ihnen bereitgestellten Status ersetzt. In Compose gibt es keine Trennung zwischen dem Erstellen eines Composables für ein Element und dem Binden von Daten daran. Diese Konzepte sind zusammengefasst.Verwenden Sie im
content
-Slot der Lazy-Liste (dem nachgestellten Lambda-Parameter) die Funktionitems()
(oder eine entsprechende Überladung), um die Daten für Ihre Liste zu durchlaufen. Rufen Sie in deritemContent
-Lambda das entsprechende zusammensetzbare Element für Ihre Daten auf:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Häufige Anwendungsfälle
Artikeldekorationen
RecyclerView
bietet das Konzept eines ItemDecoration
, mit dem Sie eine spezielle Darstellung für Elemente in der Liste hinzufügen können. Sie können beispielsweise ein ItemDecoration
hinzufügen, um Trennlinien zwischen Elementen einzufügen:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
In Compose gibt es kein entsprechendes Konzept für Elementdekorationen. Stattdessen können Sie alle UI-Dekorationen in der Liste direkt in die Komposition einfügen. Wenn Sie der Liste beispielsweise Trennlinien hinzufügen möchten, können Sie die zusammensetzbare Funktion Divider
nach jedem Element verwenden:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
Elementanimationen
Ein ItemAnimator
kann für ein RecyclerView
festgelegt werden, um das Einblenden von Elementen zu animieren, wenn Änderungen am Adapter vorgenommen werden. Standardmäßig verwendet RecyclerView
DefaultItemAnimator
, das grundlegende Animationen für Ereignisse zum Entfernen, Hinzufügen und Verschieben bietet.
Lazy Lists haben ein ähnliches Konzept durch den animateItemPlacement
-Modifikator.
Weitere Informationen finden Sie unter Artikelanimationen.
Zusätzliche Ressourcen
Weitere Informationen zur Migration einer RecyclerView
zu Compose finden Sie in den folgenden Ressourcen:
- Listen und Rastern: Dokumentation zur Implementierung von Listen und Rastern in Compose.
- Jetpack Compose Interop: Using Compose in a RecyclerView (Jetpack Compose-Interop: Compose in einem RecyclerView verwenden):
Blogpost zur effizienten Verwendung von Compose in einem
RecyclerView
.
Empfehlungen für dich
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Listen und Tabellen
CoordinatorLayout
zu Compose migrieren- Weitere Überlegungen