Pagination with Paging 3 | Android Jetpack 🚀

Rivaldy
3 min readSep 18, 2022

--

Simple pagination with Paging 3

Hubungan antara komponen library paging
Hubungan antara komponen library paging.

Alhamdulillah, karena ada waktu luang, saya akan menuliskan penggunaan Paging 3 untuk pagination beserta contoh aplikasinya.

Untuk mempersingkat waktu, saya akan menggunakan base project sebelumnya yang cukup sederhana, silahkan diklon https://github.com/im-o/kotlin-android-mvvm-architecture. Pada case ini, contoh API yang digunakan iyalah TheMovieDB, tentunya sudah menerapkan MVVM, adapun tambahan lainnya silahkan diberi saran ataupun langsung melakukan PR saja, ahahaa.

Selanjutnya kita perlu tahu apa itu Paging 3 dan google sudah menjelaskannya, silahkan dibaca, dimengerti & dipraktikkan 😅 :

Implementing Paging 3 in your app

1. Setup

Tambahkan dependenci berikut ke file build.gradle

dependencies {
...
val pagingVersion = "3.1.1"
implementation("androidx.paging:paging-runtime:$pagingVersion")
}

2. Buat Data Class & Data Source

Telah dijelaskan sebelumnya bahwa API yang akan digunakan iyalah TheMovieDB, dan endpoit API yang digunakan discover movie.

Data Class untuk responsenya

Class untuk PagingSource

fungsi dari PagingSource berikut :

  • Menangani permintaan data dengan benar dari UI, memastikan beberapa permintaan tidak terpicu bersamaan untuk kueri yang sama.
  • Mempertahankan jumlah data yang diambil dan dapat dikelola di memori.
  • Memicu permintaan untuk mengambil lebih banyak data guna melengkapi data yang telah kita ambil.
Diagram yang menunjukkan cara load() menggunakan dan mengupdate kunci.

berikut class PagingSource.

PagingSource mengharuskan kita mengimplementasikan dua fungsi: load() dan getRefreshKey().

Fungsi load() akan dipanggil oleh library Paging untuk secara asinkron mengambil lebih banyak data yang akan ditampilkan saat pengguna melakukan scroll. Objek LoadParams menyimpan informasi terkait operasi pemuatan, termasuk hal berikut:

  • Kunci halaman yang akan dimuat — Jika ini adalah pertama kalinya load() dipanggil, LoadParams.key akan menjadi null. Pada kasus ini, Anda harus menentukan kunci halaman awal. Untuk project, kita menggunakan ID artikel sebagai kunci. Mari tambahkan juga konstanta STARTING_KEY dari 0 ke bagian atas file ArticlePagingSource untuk kunci halaman awal.
  • Ukuran pemuatan — jumlah item yang diminta untuk dimuat.

Fungsi load() akan menampilkan LoadResult. LoadResult dapat berupa salah satu jenis berikut:

  • LoadResult.Page, jika hasilnya berhasil.
  • LoadResult.Error, jika terjadi error.
  • LoadResult.Invalid, jika PagingSource harus dibatalkan validasinya karena tidak dapat lagi menjamin integritas hasilnya.

LoadResult.Page memiliki tiga argumen yang diperlukan:

  • data: List dari item yang diambil.
  • prevKey: Kunci yang digunakan oleh metode load() jika harus mengambil item di belakang halaman saat ini.
  • nextKey: Kunci yang digunakan oleh metode load() jika harus mengambil item setelah halaman saat ini. source : codelabs-android-paging-basics

3. Buat PagingData dalam Repositpory

Dalam implementasi ini, langkah selanjuta iyalah pembuatan repository MovieRepository untuk mengekspos data yang dimuat ke ViewModel. Selanjutnya, ViewModel akan mempertahankan status data yang selalu tersedia dengan operator stateIn untuk eksposur ke UI.

  • PagingConfig dengan pageSize dari ITEMS_PER_PAGE dan placeholder dinonaktifkan
  • PagingSourceFactory yang menyediakan MoviesPagingSource

4. Request data dari Repository pada ViewModel

Pada tahap ini, kita telah hampir menyelesaikan data business untuk ditampilkan di UI, berikut :

5. Implementasi PagingData ke UI

Untuk mengikat PagingData ke RecyclerView, gunakan PagingDataAdapter. PagingDataAdapter akan mendapat notifikasi setiap kali konten PagingData dimuat, lalu memberi sinyal ke RecyclerView untuk memperbarui. Berikut Adapter :

Langkah terakahir iyalah pemanggilan viewmodel pada activity/fragment,

🎉 and finally we’ve done.

successfully implementation paging 3

Check my repository for full implementation.

thank you. 🎉

--

--

Rivaldy

Make it fun | Find me on my GitHub page at https://github.com/im-o. And let's connect over coffee! ☕ You can reach me on any social media at @rivaldy_o."