3. Sayfaya Taşı

Paging 3, Paging kitaplığının önceki sürümlerinden önemli ölçüde farklıdır. Bu sürüm, gelişmiş işlevsellik sunar ve Paging 2'nin kullanımıyla ilgili yaygın zorlukları giderir. Uygulamanızda Paging kitaplığının daha önceki bir sürümü kullanılıyorsa Paging 3'e geçiş hakkında daha fazla bilgi edinmek için bu sayfayı inceleyin.

Uygulamanızda kullandığınız Paging kitaplığının ilk sürümü Paging 3 ise temel kullanım bilgileri için Sayfalandırılmış verileri yükleme ve görüntüleme başlıklı makaleyi inceleyin.

Paging 3'e geçiş yapmanın avantajları

Paging 3, kitaplığın önceki sürümlerinde bulunmayan aşağıdaki özellikleri içerir:

  • Kotlin eş yordamları ve Flow için birinci sınıf destek.
  • RxJava Single veya Guava ListenableFuture temel öğeleri kullanılarak eşzamansız yükleme desteği.
  • Yeniden deneme ve yenileme işlevi de dahil olmak üzere duyarlı kullanıcı arayüzü tasarımı için yerleşik yükleme durumu ve hata sinyalleri.
  • İptal desteği ve basitleştirilmiş veri kaynağı arayüzü dahil olmak üzere depo katmanında iyileştirmeler.
  • Sunum katmanı, liste ayırıcıları, özel sayfa dönüşümleri, yükleme durumu üstbilgileri ve altbilgilerinde iyileştirmeler yapıldı.

Uygulamanızı Paging 3'e taşıma

Paging 3'e tam olarak geçmek için Paging 2'deki üç ana bileşenin tümünü taşımanız gerekir:

  • DataSource sınıf
  • PagedList
  • PagedListAdapter

Ancak bazı Paging 3 bileşenleri, Paging'in önceki sürümleriyle geriye dönük olarak uyumludur. Özellikle Paging 3'teki PagingSource API'si, eski sürümlerdeki LivePagedListBuilder ve RxPagedListBuilder için veri kaynağı olabilir. Benzer şekilde, Pager API, asPagingSourceFactory() yöntemiyle eski DataSource nesnelerini kullanabilir. Bu nedenle, aşağıdaki taşıma seçeneklerinden birini kullanabilirsiniz:

  • DataSource öğenizi PagingSource öğesine taşıyabilir ancak geri kalan sayfalama uygulamanızı değiştirmeden bırakabilirsiniz.
  • PagedList ve PagedListAdapter uygulamalarınızı taşıyabilir ancak eski DataSource API'yi kullanmaya devam edebilirsiniz.
  • Uygulamanızı Paging 3'e tamamen taşımak için tüm Paging uygulamasını taşıyabilirsiniz.

Bu sayfadaki bölümlerde, uygulamanızın her katmanındaki Paging bileşenlerinin nasıl taşınacağı açıklanmaktadır.

DataSource sınıf

Bu bölümde, eski bir sayfalama uygulamasını PagingSource kullanacak şekilde taşımak için gerekli tüm değişiklikler açıklanmaktadır.

Paging 2'deki PageKeyedDataSource, PositionalDataSource ve ItemKeyedDataSource Paging 3'te PagingSource API'sinde birleştirilmiştir. Eski API sınıflarındaki yükleme yöntemlerinin tümü, PagingSource içinde tek bir load() yönteminde birleştirilir. Eski API sınıflarının uygulamalarındaki yükleme yöntemlerinde mantığın büyük bir kısmı genellikle aynı olduğundan bu, kodun yinelenmesini azaltır.

Tüm yükleme yöntemi parametreleri, Paging 3'te her yükleme türü için alt sınıfları içeren LoadParams kapalı sınıfıyla değiştirilir. load() yönteminizdeki yük türleri arasında ayrım yapmanız gerekiyorsa LoadParams sınıfının hangi alt sınıfının iletildiğini kontrol edin: LoadParams.Refresh, LoadParams.Prepend veya LoadParams.Append.

PagingSource uygulama hakkında daha fazla bilgi edinmek için Veri kaynağı tanımlama başlıklı makaleyi inceleyin.

Tuşları yenileme

PagingSource uygulamaları, yenilemelerin yüklenen sayfa verilerinin ortasından nasıl devam edeceğini tanımlamalıdır. Bunu, en son erişilen dizin olarak state.anchorPosition'ı kullanarak doğru başlangıç anahtarını eşlemek için getRefreshKey() uygulayarak yapın.

Kotlin

// Replaces ItemKeyedDataSource.
override fun getRefreshKey(state: PagingState<String, User>): String? {
  return state.anchorPosition?.let { anchorPosition ->
    state.getClosestItemToPosition(anchorPosition)?.id
  }
}

// Replacing PositionalDataSource.
override fun getRefreshKey(state: PagingState<Int, User>): Int? {
  return state.anchorPosition
}

Java

// Replaces ItemKeyedDataSource.
@Nullable
@Override
String getRefreshKey(state: PagingState<String, User>) {
  Integer anchorPosition = state.anchorPosition;
  if (anchorPosition == null) {
    return null;
  }

  return state.getClosestItemToPosition(anchorPosition);
}

// Replaces PositionalDataSource.
@Nullable
@Override
Integer getRefreshKey(state: PagingState<Integer, User>) {
  return state.anchorPosition;
}

Java

// Replacing ItemKeyedDataSource.
@Nullable
@Override
String getRefreshKey(state: PagingState<String, User>) {
  Integer anchorPosition = state.anchorPosition;
  if (anchorPosition == null) {
    return null;
  }

  return state.getClosestItemToPosition(anchorPosition);
}

// Replacing PositionalDataSource.
@Nullable
@Override
Integer getRefreshKey(state: PagingState<Integer, User>) {
  return state.anchorPosition;
}

Dönüşümleri listeleme

Paging kitaplığının daha eski sürümlerinde, sayfalandırılmış verilerin dönüştürülmesi aşağıdaki yöntemlere dayanır:

  • DataSource.map()
  • DataSource.mapByPage()
  • DataSource.Factory.map()
  • DataSource.Factory.mapByPage()

Paging 3'te tüm dönüşümler PagingData üzerinde operatör olarak uygulanır. Sayfalandırılmış listenizi dönüştürmek için yukarıdaki listedeki yöntemlerden herhangi birini kullanıyorsanız yeni PagingSource ile Pager oluştururken dönüştürme mantığınızı DataSource konumundan PagingData konumuna taşımanız gerekir.

Sayfalama 3'ü kullanarak sayfalara ayrılmış verilere dönüşüm uygulama hakkında daha fazla bilgi edinmek için Veri akışlarını dönüştürme başlıklı makaleyi inceleyin.

PagedList

Bu bölümde, eski bir Paging uygulamasını Paging 3'te Pager ve PagingData kullanacak şekilde taşımak için gereken tüm değişiklikler açıklanmaktadır.

PagedListBuilder sınıf

PagingData, Paging 2'deki mevcut PagedList'nin yerini alır. PagingData sürümüne geçmek için aşağıdakileri güncellemeniz gerekir:

  • Sayfalama yapılandırması PagedList.Config konumundan PagingConfig konumuna taşındı.
  • LivePagedListBuilder ve RxPagedListBuilder, tek bir Pager sınıfında birleştirildi.
  • Pager, .flow özelliğiyle gözlemlenebilir bir Flow<PagingData> öğesini kullanıma sunar. RxJava ve LiveData varyantları, uzantı özellikleri olarak da kullanılabilir. Bu özellikler, Java'dan statik yöntemler kullanılarak çağrılabilir ve sırasıyla paging-rxjava* ve paging-runtime modüllerinden sağlanır.

Kotlin

val flow = Pager(
  // Configure how data is loaded by passing additional properties to
  // PagingConfig, such as prefetchDistance.
  PagingConfig(pageSize = 20)
) {
  ExamplePagingSource(backend, query)
}.flow
  .cachedIn(viewModelScope)

Java

// CoroutineScope helper provided by the lifecycle-viewmodel-ktx artifact.
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(viewModel);
Pager<Integer, User> pager = Pager<>(
  new PagingConfig(/* pageSize = */ 20),
  () -> ExamplePagingSource(backend, query));

Flowable<PagingData<User>> flowable = PagingRx.getFlowable(pager);
PagingRx.cachedIn(flowable, viewModelScope);

Java

// CoroutineScope helper provided by the lifecycle-viewmodel-ktx artifact.
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(viewModel);
Pager<Integer, User> pager = Pager<>(
  new PagingConfig(/* pageSize = */ 20),
  () -> ExamplePagingSource(backend, query));

PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager), viewModelScope);

Paging 3'ü kullanarak PagingData nesnelerinin reaktif akışını ayarlama hakkında daha fazla bilgi edinmek için PagingData akışı oluşturma başlıklı makaleyi inceleyin.

Katmanlı kaynaklar için BoundaryCallback

Paging 3'te RemoteMediator, ağ ve veritabanından gelen sayfalama için işleyici olarak PagedList.BoundaryCallback yerine kullanılır.

Paging 3'te ağdan ve veritabanından sayfalama için RemoteMediator kullanma hakkında daha fazla bilgi edinmek üzere Android Paging codelab'ine göz atın.

PagedListAdapter

Paging 2, PagedList öğesini RecyclerView öğesine bağlamak için PagedListAdapter kullanır. Sayfalama 3'te PagingData, PagedList ile değiştirilir. Uygulamanızı, kullanıcı arayüzü için Jetpack Compose kullanacak şekilde taşıyorsanız sayfalandırılmış verileri görüntülemek için bağdaştırıcıya ihtiyacınız yoktur.

Bunun yerine, paging-compose yapısını ve collectAsLazyPagingItems uzantı yöntemini kullanarak PagingData öğelerini toplayın ve @Composable işlevlerinde (ör. LazyColumn) gösterin.

Ek kaynaklar

Paging kitaplığı hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:

Codelab uygulamaları

Örnekler