0Pricing
Android Academy · Ders

Compose Listelerinde Sayfalama

Sayfalı verileri LazyColumn ile oluşturun.

Compose Listelerinde Sayfalama, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.

Sayfalı Verileri Compose'ta Görüntüleme

Veri katmanı size bir Flow<PagingData<Article>> sunar. paging-compose kitaplığı, bu akışı LazyColumn'un görüntüleyebileceği bir yapıya dönüştürür ve kullanıcı kaydırdıkça gerektiğinde yükleme yapar.

Temel köprü collectAsLazyPagingItems() işlevidir.

collectAsLazyPagingItems

Bir bileştirilebilir işlevin içinde akış üzerinde collectAsLazyPagingItems() işlevini çağırın. Bu işlev, yüklenmiş öğeleri ve yükleme durumlarını izleyen bir LazyPagingItems nesnesi döndürür ve sayfalar geldikçe kullanıcı arayüzünü yeniden oluşturur.

import androidx.paging.compose.collectAsLazyPagingItems

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

LazyPagingItems ile items()

Bir LazyColumn içinde Paging'in items() aşırı yüklemesini kullanın. Bu aşırı yükleme, LazyPagingItems içinden okur ve kullanıcı listenin sonuna yaklaştığında sonraki sayfanın yüklenmesini tetikler.

Yer tutucular etkinleştirildiğinde her öğe null olabilir; bu durumu ele alın.

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

Öğeler için Kararlı Anahtarlar

Compose'un sayfa yüklemeleri arasında öğeleri verimli şekilde izleyebilmesi ve gereksiz yeniden oluşturmalardan kaçınabilmesi için her satıra kararlı bir anahtar verin.

Öğe kimliği gibi benzersiz ve kararlı bir özellikle Paging'in itemKey yardımcısını kullanın.

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

Yükleme Durumlarını Okuma

LazyPagingItems.loadState, üç işlem için geçerli yükleme ve hata durumunu sunar:

  • refresh - ilk yükleme veya yenilemek için çekme işlemi
  • append - sonraki sayfanın yüklenmesi (aşağı kaydırma)
  • prepend - önceki sayfanın yüklenmesi (yukarı kaydırma)
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

Tam Ekran Yükleme ve Boş Durumlar

İlk görünümü yönetmek için refresh durumunu kullanın: yükleme sırasında ortalanmış bir döndürücü, hata durumunda bir hata görünümü veya gösterilecek hiçbir şey olmadığında boş durum mesajı gösterin.

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

Sayfa Eklenirken Alt Kısımda Döndürücü

Sonraki sayfa yüklenirken alt kısımda küçük bir döndürücü göstermek için append yükleme durumuna göre LazyColumn'a ek bir öğe ekleyin.

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

Hata Durumunda Yeniden Deneme

Bir ekleme işlemi başarısız olduğunda alt kısımda bir yeniden deneme satırı gösterin. articles.retry() çağrısı yalnızca başarısız yüklemeyi yeniden dener; listenin tamamını yeniden yüklemez.

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

Yenilemek İçin Çekme

articles.refresh() ile yeni bir yükleme başlatın. Bunu Material 3'ün yenilemek için çekme özelliğiyle birleştirerek göstergeyi refresh yükleme durumuna göre yönetin.

import androidx.compose.material3.pulltorefresh.PullToRefreshBox

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

Üst Bilgi ve Ayırıcılar

Sayfalı öğeleri sayfasız içerikle aynı LazyColumn içinde özgürce karıştırabilirsiniz. Sayfalı items() çağrısının çevresine sabit bir üst bilgi, arama çubuğu veya bölüm ayırıcıları ekleyin.

Her şey tek bir LazyColumn içinde bulunduğundan kaydırma birleşik ve akıcı kalır.

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

Sayfalı Listeleri Önizleme

Compose önizlemeleri ve testler için gerçek bir ağa ihtiyacınız yoktur. Örnek verileri PagingData.from(...) içine sarıp akış olarak sunun.

Bu sayede liste kullanıcı arayüzünüzü bağımsız olarak oluşturup önizleyebilirsiniz.

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

Kısa Kontrol

Bir Flow<PagingData> değerini Compose LazyColumn'un görüntüleyebileceği bir yapıya hangi işlev dönüştürür?

Özet: Compose'ta Sayfalama

Sayfalı verileri Jetpack Compose'ta görüntülediniz:

  • collectAsLazyPagingItems(), akış ile kullanıcı arayüzü arasında köprü kurar
  • Paging'in items() aşırı yüklemesi siz kaydırdıkça daha fazlasını yükler; null yer tutucuları ele alın
  • Kararlı anahtarlar için itemKey { it.id } kullanın
  • loadState.refresh/append/prepend, döndürücüleri, hataları ve boş durumları yönetir
  • retry() ve refresh(), hatalardan kurtulup yeniden yükleme yapar

Sırada: RemoteMediator ile ağ ve veritabanını birleştirmek var.

Sıkça Sorulan Sorular

“Compose Listelerinde Sayfalama” dersi ücretsiz mi?

Evet — “Compose Listelerinde Sayfalama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.

“Compose Listelerinde Sayfalama” dersinde ne öğreneceğim?

Sayfalı verileri LazyColumn ile oluşturun. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Compose Listelerinde Sayfalama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Sayfalama Neden Kullanılır
  2. PagingSource ve Pager
  3. Compose Listelerinde Sayfalama
  4. RemoteMediator ve Önbelleğe Alma
← Android Academy Sayfasına Dön