Paging in Compose-Listen
Gepaginierte Daten mit LazyColumn darstellen
Paging in Compose-Listen ist eine kostenlose Android Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Android Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.
Seitennummerierte Daten in Compose rendern
Die Datenschicht stellt Ihnen einen Flow<PagingData<Article>> bereit. Die Bibliothek paging-compose wandelt diesen Flow in etwas um, das eine LazyColumn rendern kann – einschließlich des bedarfsgesteuerten Ladens beim Scrollen.
Die zentrale Verbindung ist collectAsLazyPagingItems().
collectAsLazyPagingItems
Rufen Sie collectAsLazyPagingItems() innerhalb eines Composables für den Flow auf. Die Funktion gibt ein Objekt vom Typ LazyPagingItems zurück, das die geladenen Elemente und Ladezustände verfolgt und die Benutzeroberfläche neu zusammensetzt, sobald Seiten eintreffen.
import androidx.paging.compose.collectAsLazyPagingItems
@Composable
fun ArticleScreen(viewModel: ArticleViewModel) {
val articles = viewModel.articles.collectAsLazyPagingItems()
ArticleList(articles)
}items() mit LazyPagingItems
Verwenden Sie innerhalb einer LazyColumn die Paging-Überladung von items(). Sie liest aus LazyPagingItems und löst das Laden der nächsten Seite aus, wenn der Benutzer sich dem Ende nähert.
Wenn Platzhalter aktiviert sind, kann jedes Element null sein. Behandeln Sie daher diesen Fall.
import androidx.compose.foundation.lazy.LazyColumn
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.items
@Composable
fun ArticleList(articles: LazyPagingItems<Article>) {
LazyColumn {
items(articles) { article ->
if (article != null) {
ArticleRow(article)
}
}
}
}Stabile Schlüssel für Elemente
Geben Sie jeder Zeile einen stabilen Schlüssel, damit Compose die Elemente beim Laden weiterer Seiten effizient verfolgen und unnötige Neuzusammensetzungen vermeiden kann.
Verwenden Sie die Paging-Hilfsfunktion itemKey mit einer eindeutigen, stabilen Eigenschaft wie der ID des Elements.
import androidx.paging.compose.itemKey
LazyColumn {
items(
count = articles.itemCount,
key = articles.itemKey { it.id }
) { index ->
val article = articles[index]
if (article != null) ArticleRow(article)
}
}Ladezustände auslesen
LazyPagingItems.loadState stellt den aktuellen Lade- und Fehlerzustand für drei Vorgänge bereit:
refresh– das anfängliche Laden oder das Aktualisieren durch Herunterziehenappend– Laden der nächsten Seite (Herunterscrollen)prepend– Laden der vorherigen Seite (Hochscrollen)
import androidx.paging.LoadState
val refresh = articles.loadState.refresh
val append = articles.loadState.append
val isInitialLoading = refresh is LoadState.Loading
val isLoadingMore = append is LoadState.LoadingLade- und Leerzustände im Vollbild
Verwenden Sie den Zustand refresh, um die erste Anzeige zu steuern: einen zentrierten Ladekreisel während des Ladens, eine Fehleransicht bei einem Fehler oder eine leere Meldung, wenn keine Daten angezeigt werden können.
when (val refresh = articles.loadState.refresh) {
is LoadState.Loading -> FullScreenSpinner()
is LoadState.Error -> FullScreenError(
message = refresh.error.message,
onRetry = { articles.retry() }
)
is LoadState.NotLoading -> {
if (articles.itemCount == 0) EmptyState()
else ArticleList(articles)
}
}Ladekreisel am unteren Rand beim Anhängen
Um während des Ladens der nächsten Seite unten einen kleinen Ladekreisel anzuzeigen, fügen Sie der LazyColumn abhängig vom Ladezustand append ein zusätzliches Element hinzu.
LazyColumn {
items(count = articles.itemCount, key = articles.itemKey { it.id }) { index ->
articles[index]?.let { ArticleRow(it) }
}
if (articles.loadState.append is LoadState.Loading) {
item {
Box(Modifier.fillMaxWidth().padding(16.dp), Alignment.Center) {
CircularProgressIndicator()
}
}
}
}Bei Fehlern erneut versuchen
Wenn das Anhängen fehlschlägt, zeigen Sie unten eine Zeile für einen erneuten Versuch an. Der Aufruf von articles.retry() wiederholt nur den fehlgeschlagenen Ladevorgang – die gesamte Liste wird nicht neu geladen.
val append = articles.loadState.append
if (append is LoadState.Error) {
item {
Row(Modifier.fillMaxWidth().padding(16.dp), Arrangement.Center) {
Text("Couldn't load more")
Spacer(Modifier.width(8.dp))
Button(onClick = { articles.retry() }) { Text("Retry") }
}
}
}Durch Herunterziehen aktualisieren
Lösen Sie mit articles.refresh() einen neuen Ladevorgang aus. Kombinieren Sie dies mit dem Aktualisieren durch Herunterziehen aus Material 3 und steuern Sie die Anzeige anhand des Ladezustands refresh.
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
val isRefreshing = articles.loadState.refresh is LoadState.Loading
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = { articles.refresh() }
) {
ArticleList(articles)
}Kopfzeile und Trennlinien
Sie können seitennummerierte Elemente problemlos mit nicht seitennummerierten Inhalten in derselben LazyColumn mischen. Fügen Sie rund um den Aufruf von items() eine Sticky Header, eine Suchleiste oder Abschnittstrennlinien hinzu.
Da alles in einer LazyColumn enthalten ist, bleibt das Scrollen einheitlich und flüssig.
LazyColumn {
item { SearchBar(query, onQueryChange) }
items(count = articles.itemCount, key = articles.itemKey { it.id }) { index ->
val article = articles[index]
if (article != null) {
ArticleRow(article)
HorizontalDivider()
}
}
if (articles.loadState.append.endOfPaginationReached) {
item { Text("You're all caught up", Modifier.padding(16.dp)) }
}
}Seitennummerierte Listen in der Vorschau
Für Compose-Vorschauen und Tests benötigen Sie kein echtes Netzwerk. Verpacken Sie Beispieldaten in PagingData.from(...) und stellen Sie sie als Flow bereit.
So können Sie die Benutzeroberfläche Ihrer Liste unabhängig erstellen und in der Vorschau anzeigen.
import androidx.paging.PagingData
import kotlinx.coroutines.flow.flowOf
@Preview
@Composable
fun ArticleListPreview() {
val sample = listOf(Article(1, "Hello"), Article(2, "World"))
val flow = flowOf(PagingData.from(sample))
ArticleList(flow.collectAsLazyPagingItems())
}Kurze Überprüfung
Welche Funktion wandelt einen Flow<PagingData> in etwas um, das eine Compose-LazyColumn rendern kann?
Zusammenfassung: Paging in Compose
Sie haben seitennummerierte Daten in Jetpack Compose dargestellt:
collectAsLazyPagingItems()verbindet den Flow mit der Benutzeroberfläche- Die Paging-Überladung von
items()lädt beim Scrollen weitere Daten; behandeln Sienull-Platzhalter - Verwenden Sie
itemKey { it.id }für stabile Schlüssel loadState.refresh/append/prependsteuern Ladekreisel, Fehler- und Leerzuständeretry()undrefresh()ermöglichen die Fehlerbehebung und das erneute Laden
Als Nächstes: Netzwerk und Datenbank mit RemoteMediator kombinieren.
Häufig gestellte Fragen
Ist die Lektion „Paging in Compose-Listen“ kostenlos?
Ja — der vollständige Text von „Paging in Compose-Listen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Android Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Paging in Compose-Listen“?
Gepaginierte Daten mit LazyColumn darstellen Du übst Android Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Android Academy zu starten?
Keine Vorkenntnisse erforderlich. Android Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Paging in Compose-Listen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Android Academy-Lektion Code schreiben und ausführen?
Ja. Jede Android Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum Paging?
- PagingSource und Pager
- Paging in Compose-Listen
- RemoteMediator und Caching