0Pricing
Android Academy · Lektion

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 Herunterziehen
  • append – 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.Loading

Lade- 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 Sie null-Platzhalter
  • Verwenden Sie itemKey { it.id } für stabile Schlüssel
  • loadState.refresh/append/prepend steuern Ladekreisel, Fehler- und Leerzustände
  • retry() und refresh() 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

  1. Warum Paging?
  2. PagingSource und Pager
  3. Paging in Compose-Listen
  4. RemoteMediator und Caching
← Zurück zu Android Academy