Paging dalam Daftar Compose
Render data berhalaman dengan LazyColumn.
Paging dalam Daftar Compose adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 4 pelajaran total.
Menampilkan Data Berhalaman di Compose
Lapisan data memberikan Flow<PagingData<Article>>. Pustaka paging-compose mengubah aliran tersebut menjadi sesuatu yang dapat ditampilkan oleh LazyColumn, lengkap dengan pemuatan sesuai kebutuhan saat pengguna menggulir.
Penghubung utamanya adalah collectAsLazyPagingItems().
collectAsLazyPagingItems
Panggil collectAsLazyPagingItems() pada aliran di dalam composable. Fungsi ini mengembalikan objek LazyPagingItems yang melacak item yang telah dimuat dan status pemuatan, lalu menyusun ulang antarmuka pengguna saat halaman tiba.
import androidx.paging.compose.collectAsLazyPagingItems
@Composable
fun ArticleScreen(viewModel: ArticleViewModel) {
val articles = viewModel.articles.collectAsLazyPagingItems()
ArticleList(articles)
}items() dengan LazyPagingItems
Di dalam LazyColumn, gunakan overload Paging untuk items(). Fungsi ini membaca dari LazyPagingItems dan memicu pemuatan halaman berikutnya saat pengguna mendekati akhir daftar.
Setiap item dapat bernilai null ketika placeholder diaktifkan, jadi tangani kasus tersebut.
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)
}
}
}
}Kunci Stabil untuk Item
Berikan kunci stabil pada setiap baris agar Compose dapat melacak item secara efisien selama pemuatan halaman dan menghindari penyusunan ulang yang tidak perlu.
Gunakan fungsi pembantu Paging itemKey dengan properti yang unik dan stabil, seperti id item.
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)
}
}Membaca Status Pemuatan
LazyPagingItems.loadState menampilkan status pemuatan dan kesalahan saat ini untuk tiga operasi:
refresh- pemuatan awal atau tarik untuk menyegarkanappend- memuat halaman berikutnya (menggulir ke bawah)prepend- memuat halaman sebelumnya (menggulir ke atas)
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.LoadingStatus Pemuatan Layar Penuh dan Kosong
Gunakan status refresh untuk mengatur tampilan awal: pemutar di tengah saat memuat, tampilan kesalahan jika gagal, atau pesan kosong saat tidak ada yang dapat ditampilkan.
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)
}
}Pemutar Footer Saat Menambahkan Data
Untuk menampilkan pemutar kecil di bagian bawah saat halaman berikutnya dimuat, tambahkan item ekstra ke LazyColumn berdasarkan status pemuatan 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()
}
}
}
}Mencoba Lagi setelah Kesalahan
Saat penambahan data gagal, tampilkan baris coba lagi di bagian bawah. Memanggil articles.retry() hanya mengulangi pemuatan yang gagal - fungsi ini tidak memuat ulang seluruh daftar.
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") }
}
}
}Tarik untuk Menyegarkan
Picu pemuatan baru dengan articles.refresh(). Gabungkan dengan fitur tarik untuk menyegarkan dari Material 3, dan kendalikan indikatornya dari status pemuatan refresh.
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
val isRefreshing = articles.loadState.refresh is LoadState.Loading
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = { articles.refresh() }
) {
ArticleList(articles)
}Header dan Pemisah
Anda dapat dengan bebas mencampur item berhalaman dengan konten tanpa halaman dalam LazyColumn yang sama. Tambahkan header lengket, bilah pencarian, atau pemisah bagian di sekitar pemanggilan items() berhalaman.
Karena semuanya berada dalam satu LazyColumn, pengguliran tetap terpadu dan lancar.
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)) }
}
}Melihat Pratinjau Daftar Berhalaman
Untuk pratinjau dan pengujian Compose, Anda tidak memerlukan jaringan nyata. Bungkus data contoh dalam PagingData.from(...) dan tampilkan sebagai aliran.
Dengan demikian, Anda dapat membuat dan melihat pratinjau antarmuka daftar secara terpisah.
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())
}Pemeriksaan Singkat
Fungsi apa yang mengubah Flow<PagingData> menjadi sesuatu yang dapat ditampilkan oleh LazyColumn Compose?
Ringkasan: Paging di Compose
Anda telah menampilkan data berhalaman di Jetpack Compose:
collectAsLazyPagingItems()menghubungkan aliran ke antarmuka pengguna- Overload Paging untuk
items()memuat lebih banyak data saat Anda menggulir; tangani placeholdernull - Gunakan
itemKey { it.id }untuk kunci yang stabil loadState.refresh/append/prependmengendalikan pemutar, kesalahan, dan status kosongretry()danrefresh()memulihkan kegagalan dan memuat ulang data
Berikutnya: menggabungkan jaringan dan basis data dengan RemoteMediator.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Paging dalam Daftar Compose” gratis?
Ya — teks lengkap “Paging dalam Daftar Compose” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Paging dalam Daftar Compose”?
Render data berhalaman dengan LazyColumn. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Android Academy?
Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Paging dalam Daftar Compose” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Paging
- PagingSource dan Pager
- Paging dalam Daftar Compose
- RemoteMediator dan Caching