3. Sayfaya Taşı

Sayfa 3, Sayfalama kitaplığının önceki sürümlerinden önemli ölçüde farklıdır. Bu sürüm gelişmiş işlevler sunar ve Sayfa 2'nin kullanımıyla ilgili yaygın sorunları ele alır. Uygulamanız zaten Sayfalama kitaplığının önceki bir sürümünü kullanıyorsa Sayfa 3'e geçiş hakkında daha fazla bilgi edinmek için bu sayfayı okuyun.

Sayfa 3, uygulamanızda kullandığınız Sayfalama kitaplığının ilk sürümüyse temel kullanım bilgileri için Sayfalandırılmış verileri yükleme ve görüntüleme konusuna bakın.

3. Sayfaya geçmenin avantajları

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

  • Kotlin eş yordamları ve Flow için birinci sınıf destek.
  • RxJava Single veya Guava ListenableFuture temel öğelerini kullanarak eşzamansız yükleme desteği.
  • Yeniden deneme ve yenileme işlevleri dahil, duyarlı kullanıcı arayüzü tasarımı için dahili yükleme durumu ve hata sinyalleri.
  • İptal desteği ve basitleştirilmiş veri kaynağı arayüzü gibi kod deposu katmanında yapılan iyileştirmeler.
  • Sunu katmanı, liste ayırıcıları, özel sayfa dönüşümleri ve yükleme durumu üst ve alt bilgilerinde yapılan iyileştirmeler.

Uygulamanızı 3. Sayfaya taşıyın

Sayfa 3'e tamamen geçiş yapmak için 2. Sayfa'dan üç ana bileşeni de taşımanız gerekir:

  • DataSource sınıf
  • PagedList
  • PagedListAdapter

Ancak bazı Sayfalama 3 bileşenleri, Sayfalama'nın önceki sürümleriyle geriye dönük uyumludur. Özellikle Sayfa 3'teki PagingSource API, LivePagedListBuilder ve eski sürümlere ait RxPagedListBuilder için bir veri kaynağı olabilir. Benzer şekilde, Pager API, asPagingSourceFactory() yöntemiyle eski DataSource nesnelerini kullanabilir. Bu durumda, aşağıdaki taşıma seçeneklerine sahip olursunuz:

  • DataSource öğenizi PagingSource adresine taşıyabilir, ancak çağrı uygulamanızın geri kalan kısmını değiştirmeden bırakabilirsiniz.
  • PagedList ve PagedListAdapter öğelerinizi taşıyabilir ancak eski DataSource API'yi kullanmaya devam edebilirsiniz.
  • Uygulamanızı Sayfa 3'e tamamen taşımak için Sayfalama uygulamasının tamamını taşıyabilirsiniz.

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

DataSource sınıfları

Bu bölümde, daha eski bir Sayfalama uygulamasını PagingSource kullanmak amacıyla taşımak için gerekli tüm değişiklikler açıklanmaktadır.

Sayfa 2'deki PageKeyedDataSource, PositionalDataSource ve ItemKeyedDataSource, Sayfa 3'teki PagingSource API'de birleştirilir. Tüm eski API sınıflarındaki yükleme yöntemleri, PagingSource bölgesinde tek bir load() yönteminde birleştirilir. Eski API sınıflarının uygulamalarındaki yükleme yöntemlerindeki mantığın büyük bir kısmı genellikle aynı olduğundan kod tekrarını azaltır.

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

PagingSource uygulamasını uygulama hakkında daha fazla bilgi edinmek için Veri kaynağı tanımlama bölümüne bakın.

Anahtarları yenile

PagingSource uygulamaları, yenilemelerin yüklenen sayfa bölümü içeren verilerin ortasından nasıl devam edeceğini tanımlamalıdır. Bu işlemi, en son erişilen dizin olarak state.anchorPosition kullanıp doğru başlangıç anahtarını eşlemek için getRefreshKey() uygulayın.

Kotlin

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

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

Java

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

  return state.getClosestItemToPosition(anchorPosition);
}

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

Java

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

  return state.getClosestItemToPosition(anchorPosition);
}

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

Dönüşümleri listeleme

Sayfalandırma kitaplığının eski sürümlerinde sayfalandırılmış verilerin dönüşümü aşağıdaki yöntemlere dayanır:

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

3. Sayfa'da, tüm dönüşümler PagingData üzerinde operatör olarak uygulanır. Sayfalı listenizi dönüştürmek için önceki listede yer alan yöntemlerden herhangi birini kullanırsanız yeni PagingSource kullanarak Pager oluştururken dönüşüm mantığınızı DataSource konumundan PagingData öğesine taşımanız gerekir.

Sayfa 3'ü kullanarak sayfalandırılmış verilere dönüşüm uygulama hakkında daha fazla bilgi edinmek için Veri akışlarını dönüştürme bölümüne bakın.

Sayfalı Liste

Bu bölümde, Sayfa 3'te Pager ve PagingData kullanmak üzere eski bir Sayfalama uygulamasını taşımak için gerekli tüm değişiklikler açıklanmaktadır.

PagedListBuilder sınıfları

PagingData, Sayfa 2'deki mevcut PagedList öğesinin yerini alır. PagingData ürününe taşımak için aşağıdakileri güncellemeniz gerekir:

  • Sayfalandırma 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> sunuyor. RxJava ve LiveData varyantları, uzantı özellikleri olarak da mevcuttur. Bunlar, statik yöntemlerle Java'dan ç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);

Çağrı 3'ü kullanarak PagingData nesnelerinin reaktif bir akışını ayarlama hakkında daha fazla bilgi edinmek için PagingData akışı oluşturma konusuna bakın.

Katmanlı kaynaklar için BoundaryCallback

3. Sayfalama'da RemoteMediator, ağ ve veritabanından sayfalama için işleyici olarak PagedList.BoundaryCallback yerine geçer.

Sayfa 3'te ağ ve veritabanından sayfaya RemoteMediator kullanımı hakkında daha fazla bilgi edinmek için Android Sayfalama codelab'ine bakın.

Sayfa Listesi Bağdaştırıcısı

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

3. sayfa, yeni PagingData reaktif akışlarının işlenmesi için PagingDataAdapter sağlar. Aksi takdirde, PagedListAdapter ve PagingDataAdapter aynı arayüze sahip olur. PagedListAdapter ürününden PagingDataAdapter aboneliğine geçiş yapmak için PagedListAdapter uygulamanızı, bunun yerine PagingDataAdapter kapsamını genişletecek şekilde değiştirin.

PagingDataAdapter hakkında daha fazla bilgi edinmek için RecyclerView adaptörü tanımlama bölümüne bakın.

Eş ZamansızSayfalıListefarkı

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

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Ek kaynaklar

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

Codelab uygulamaları

Sana Özel