Paging 3'e (Görünümler) taşıma

Kavramlar ve Jetpack Compose uygulaması

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 ilk Paging kitaplığı 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üştürmeleri, yükleme durumu başlıkları 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 sayfalama uygulamanızın geri kalanını 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 Paging uygulamasının tamamını taşıyabilirsiniz.

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

Taşımaya genel bakış

RecyclerView uygulamanızı korurken Paging 3'e tamamen geçmek için aşağıdaki bileşenleri güncellemeniz gerekir:

Paging 2 Component

Sayfalandırma 3 Değişimi

PageKeyedDataSource

PagingSource

PagedListAdapter

PagingDataAdapter

LivePagedListBuilder

Pager

BoundaryCallback

RemoteMediator

DataSource sınıf

Bu bölümde, eski bir Paging uygulamasının PagingSource kullanacak şekilde taşınması için gerekli 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 tüm yükleme yöntemleri, load yönteminde tek bir PagingSource yöntem olarak birleştirilir. Eski API sınıflarının uygulamalarındaki yükleme yöntemlerinin çoğunda mantık 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önteminizde 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.

Anahtarları yenileme

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

Java (RxJava)

// 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 (Guava/LiveData)

// 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;
}

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 ile değiştirilir. 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<PagingData> ile gözlemlenebilir bir Flow<PagingData> ortaya çıkarır .flow mülk. RxJava ve LiveData varyantları, uzantı özellikleri olarak da kullanılabilir. Bu özellikler, Java'dan statik yöntemlerle çağrılabilir ve sırasıyla paging-rxjava* ve paging-runtime modüllerinden sağlanır.

Java (RxJava)

// 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 (Guava/LiveData)

// 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.

PagedListAdapter

Bu bölümde, eski bir Paging uygulamasını Paging 3'teki PagingDataAdapter veya AsyncPagingDataDiffer sınıflarını kullanacak şekilde taşımak için gereken tüm değişiklikler açıklanmaktadır.

Paging 2, PagedList öğesini RecyclerView öğesine bağlamak için PagedListAdapter kullanır. Sayfalama 3'te PagingData, PagedList ile değiştirilir.

Paging 3, yeni PagingData reaktif akışlarını işlemek için PagingDataAdapter sağlar. Aksi takdirde, PagedListAdapter ve PagingDataAdapter aynı arayüze sahiptir. PagedListAdapter'dan PagingDataAdapter'ye geçmek için PagedListAdapter uygulamanızı PagingDataAdapter'yi genişletecek şekilde değiştirin.

PagingDataAdapter hakkında daha fazla bilgi edinmek için Define a RecyclerView adapter başlıklı makaleyi inceleyin.

AsyncPagedListDiffer

Şu anda RecyclerView.Adapter ile özel bir AsyncPagedListDiffer uygulaması kullanıyorsanız uygulamanızı Paging 3'te sağlanan AsyncPagingDataDiffer kullanacak şekilde taşıyın:

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java (RxJava)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java (Guava/LiveData)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);