Bermigrasi ke Paging 3 (Tampilan)

Konsep dan penerapan Jetpack Compose

Paging 3 sangat berbeda dengan versi Paging library yang sebelumnya. Versi ini memberikan fungsi yang disempurnakan dan menangani kesulitan umum dalam penggunaan Paging 2. Jika aplikasi Anda sudah menggunakan library Paging versi sebelumnya, baca halaman ini untuk mempelajari lebih lanjut cara bermigrasi ke Paging 3.

Jika Paging 3 adalah library Paging versi pertama yang Anda gunakan di aplikasi, lihat Memuat dan menampilkan data yang di-page untuk informasi tentang penggunaan dasar.

Manfaat melakukan migrasi ke Paging 3

Paging 3 memiliki fitur berikut yang tidak ada di versi library sebelumnya:

  • Dukungan kelas satu untuk Flow dan coroutine Kotlin.
  • Dukungan untuk pemuatan asinkron menggunakan primitif Single dari RxJava atau ListenableFuture dari Guava.
  • Status pemuatan bawaan dan sinyal error untuk desain UI yang responsif, termasuk fungsi coba lagi (retry) dan refresh.
  • Peningkatan di lapisan repositori, termasuk dukungan pembatalan dan antarmuka sumber data yang disederhanakan.
  • Peningkatan di lapisan presentasi, pemisah daftar, transformasi halaman kustom, serta header dan footer status pemuatan.

Memigrasikan aplikasi ke Paging 3

Untuk sepenuhnya bermigrasi ke Paging 3, ketiga komponen utama dari Paging 2 harus dimigrasikan:

  • Class DataSource
  • PagedList
  • PagedListAdapter

Namun, ada beberapa komponen Paging 3 yang memiliki kompatibilitas mundur dengan versi Paging sebelumnya. Secara khusus, API PagingSource dari Paging 3 dapat menjadi sumber data untuk LivePagedListBuilder dan RxPagedListBuilder dari versi sebelumnya. Demikian pula, API Pager dapat menggunakan objek DataSource versi lama dengan metode asPagingSourceFactory. Artinya, Anda memiliki opsi migrasi berikut:

  • Anda dapat memigrasikan DataSource ke PagingSource tanpa mengubah penerapan Paging lainnya.
  • Anda dapat memigrasikan PagedList dan PagedListAdapter sambil tetap menggunakan API DataSource versi lama.
  • Anda dapat memigrasikan seluruh penerapan Paging untuk memigrasikan aplikasi sepenuhnya ke Paging 3.

Bagian di halaman ini menjelaskan cara memigrasikan komponen Paging di setiap lapisan aplikasi Anda.

Ringkasan migrasi

Untuk sepenuhnya bermigrasi ke Paging 3 sambil mempertahankan penerapan RecyclerView, Anda harus mengupdate komponen berikut:

Komponen Paging 2

Penggantian Paging 3

PageKeyedDataSource

PagingSource

PagedListAdapter

PagingDataAdapter

LivePagedListBuilder

Pager

BoundaryCallback

RemoteMediator

Class DataSource

Bagian ini menjelaskan perubahan yang diperlukan untuk memigrasikan penerapan Paging versi lama agar dapat menggunakan PagingSource.

PageKeyedDataSource, PositionalDataSource, dan ItemKeyedDataSource dari Paging 2 digabungkan ke dalam API PagingSource di Paging 3. Metode pemuatan dari semua class API versi lama digabungkan menjadi satu metode load di PagingSource. Tindakan ini akan mengurangi duplikasi kode karena banyak logika yang sering kali identik di seluruh metode pemuatan di dalam penerapan class API versi lama.

Semua parameter metode pemuatan diganti dalam Paging 3 dengan class tertutup LoadParams yang menyertakan subclass untuk setiap jenis pemuatan. Jika Anda perlu membedakan jenis muatan di metode load, periksa subclass LoadParams yang diteruskan, apakah LoadParams.Refresh, LoadParams.Prepend, atau LoadParams.Append.

Untuk mempelajari penerapan PagingSource lebih lanjut, lihat Menentukan sumber data.

Me-refresh kunci

Implementasi PagingSource harus menentukan cara refresh dilanjutkan dari tengah data halaman yang dimuat. Lakukan hal ini dengan menerapkan getRefreshKey untuk memetakan kunci awal yang tepat dengan state.anchorPosition sebagai indeks yang terakhir diakses.

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

Bagian ini menjelaskan semua perubahan yang diperlukan untuk memigrasikan penerapan Paging sebelumnya agar dapat menggunakan Pager dan PagingData dalam Paging 3.

Class PagedListBuilder

PagingData menggantikan PagedList yang ada dari Paging 2. Untuk memigrasikannya ke PagingData, Anda harus memastikan hal berikut:

  • Konfigurasi Paging telah dipindahkan dari PagedList.Config ke PagingConfig.
  • LivePagedListBuilder dan RxPagedListBuilder telah digabung menjadi satu class Pager.
  • Pager menampilkan Flow<PagingData> yang dapat diamati dengan .properti flow. Varian RxJava dan LiveData juga tersedia sebagai properti ekstensi, yang dapat dipanggil dari Java melalui metode statis, serta disediakan masing-masing dari modul paging-rxjava* dan paging-runtime.

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

Untuk mempelajari lebih lanjut cara menyiapkan aliran reaktif objek PagingData menggunakan Paging 3, lihat Menyiapkan aliran PagingData.

PagedListAdapter

Bagian ini menjelaskan semua perubahan yang diperlukan untuk memigrasikan penerapan Paging versi lama agar dapat menggunakan class PagingDataAdapter atau AsyncPagingDataDiffer dari Paging 3.

Paging 2 menggunakan PagedListAdapter untuk mengikat PagedList ke RecyclerView. Di Paging 3, PagingData menggantikan PagedList.

Paging 3 menyediakan PagingDataAdapter untuk menangani aliran reaktif PagingData yang baru. Jika tidak ada, PagedListAdapter dan PagingDataAdapter akan memiliki antarmuka yang sama. Untuk bermigrasi dari PagedListAdapter ke PagingDataAdapter, ubah penerapan PagedListAdapter menjadi ekstensi PagingDataAdapter.

Untuk mempelajari PagingDataAdapter lebih lanjut, lihat Menetapkan adaptor RecyclerView.

AsyncPagedListDiffer

Jika Anda sedang menggunakan implementasi RecyclerView.Adapter kustom dengan AsyncPagedListDiffer, migrasikan penerapan agar dapat menggunakan AsyncPagingDataDiffer yang disediakan di Paging 3:

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java (RxJava)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java (Guava/LiveData)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);