0Pricing
Android Academy · Lekcja

Paging na listach Compose

Renderuj dane stronicowane za pomocą LazyColumn

Paging na listach Compose to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.

Renderowanie stronicowanych danych w Compose

Warstwa danych przekazuje obiekt Flow<PagingData<Article>>. Biblioteka paging-compose przekształca ten przepływ w dane, które może renderować LazyColumn, wraz z ładowaniem na żądanie podczas przewijania.

Kluczowym połączeniem jest collectAsLazyPagingItems().

collectAsLazyPagingItems

Należy wywołać collectAsLazyPagingItems() na przepływie wewnątrz funkcji composable. Zwraca on obiekt LazyPagingItems, który śledzi załadowane elementy i stany ładowania oraz ponownie komponuje interfejs, gdy pojawiają się kolejne strony.

import androidx.paging.compose.collectAsLazyPagingItems

@Composable
fun ArticleScreen(viewModel: ArticleViewModel) {
    val articles = viewModel.articles.collectAsLazyPagingItems()
    ArticleList(articles)
}

items() z LazyPagingItems

Wewnątrz elementu LazyColumn należy użyć przeciążenia items() z Paging. Odczytuje ono dane z LazyPagingItems i uruchamia ładowanie następnej strony, gdy użytkownik zbliża się do końca.

Każdy element może mieć wartość null, gdy włączono miejsca zastępcze, dlatego należy obsłużyć ten przypadek.

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)
            }
        }
    }
}

Stabilne klucze elementów

Należy nadać każdemu wierszowi stabilny klucz, aby Compose mogło efektywnie śledzić elementy podczas ładowania stron i unikać niepotrzebnej rekompozycji.

Należy użyć pomocniczej funkcji Paging itemKey z unikalną, stabilną właściwością, taką jak identyfikator elementu.

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)
    }
}

Odczytywanie stanów ładowania

LazyPagingItems.loadState udostępnia bieżący stan ładowania i błędu dla trzech operacji:

  • refresh - początkowe ładowanie lub ładowanie po geście przeciągnięcia w celu odświeżenia
  • append - ładowanie następnej strony (przewijanie w dół)
  • prepend - ładowanie poprzedniej strony (przewijanie w górę)
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

Pełnoekranowe stany ładowania i pustej listy

Stan refresh służy do sterowania początkowym widokiem: wyśrodkowane pokrętło podczas ładowania, widok błędu w przypadku niepowodzenia lub komunikat o pustej liście, gdy nie ma nic do wyświetlenia.

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)
    }
}

Pokrętło na dole podczas dołączania

Aby wyświetlić niewielkie pokrętło na dole podczas ładowania następnej strony, należy dodać dodatkowy element do LazyColumn na podstawie stanu ładowania append.

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()
            }
        }
    }
}

Ponawianie po błędzie

Gdy operacja dołączania zakończy się niepowodzeniem, należy wyświetlić na dole wiersz z opcją ponowienia. Wywołanie articles.retry() ponawia tylko nieudaną operację ładowania - nie ładuje ponownie całej listy.

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") }
        }
    }
}

Przeciągnięcie w celu odświeżenia

Nowe ładowanie można uruchomić za pomocą articles.refresh(). Należy połączyć je z funkcją przeciągnięcia w celu odświeżenia z Material 3, sterując wskaźnikiem na podstawie stanu ładowania refresh.

import androidx.compose.material3.pulltorefresh.PullToRefreshBox

val isRefreshing = articles.loadState.refresh is LoadState.Loading
PullToRefreshBox(
    isRefreshing = isRefreshing,
    onRefresh = { articles.refresh() }
) {
    ArticleList(articles)
}

Nagłówek i separatory

W tej samej LazyColumn można swobodnie łączyć stronicowane elementy z treścią niestronicowaną. Wokół wywołania stronicowanego items() można dodać przyklejany nagłówek, pasek wyszukiwania lub separatory sekcji.

Ponieważ wszystko znajduje się w jednym elemencie LazyColumn, przewijanie pozostaje jednolite i płynne.

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)) }
    }
}

Podgląd list stronicowanych

W przypadku podglądów Compose i testów nie potrzebują Państwo prawdziwej sieci. Należy opakować przykładowe dane w PagingData.from(...) i udostępnić je jako przepływ.

Pozwala to tworzyć i wyświetlać podgląd interfejsu listy niezależnie od reszty aplikacji.

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())
}

Szybkie sprawdzenie

Która funkcja przekształca obiekt Flow<PagingData> w dane, które może renderować element Compose LazyColumn?

Podsumowanie: Paging w Compose

Wyrenderowali Państwo stronicowane dane w Jetpack Compose:

  • collectAsLazyPagingItems() łączy przepływ z interfejsem użytkownika
  • Przeciążenie items() z Paging ładuje więcej danych podczas przewijania; należy obsłużyć miejsca zastępcze o wartości null
  • Należy użyć itemKey { it.id } do definiowania stabilnych kluczy
  • loadState.refresh/append/prepend sterują pokrętłami, komunikatami błędów i stanami pustej listy
  • retry() i refresh() umożliwiają obsługę błędów i ponowne ładowanie

Następnie: łączenie sieci i bazy danych za pomocą RemoteMediator.

Często zadawane pytania

Czy lekcja „Paging na listach Compose” jest bezpłatna?

Tak — pełny tekst „Paging na listach Compose” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Paging na listach Compose”?

Renderuj dane stronicowane za pomocą LazyColumn Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Paging na listach Compose”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego warto stosować Paging
  2. PagingSource i Pager
  3. Paging na listach Compose
  4. RemoteMediator i buforowanie
← Powrót do Android Academy