Pagination with Paging 3 | Android Jetpack 🚀
Simple pagination with Paging 3
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.
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 menjadinull
. Pada kasus ini, Anda harus menentukan kunci halaman awal. Untuk project, kita menggunakan ID artikel sebagai kunci. Mari tambahkan juga konstantaSTARTING_KEY
dari0
ke bagian atas fileArticlePagingSource
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
, jikaPagingSource
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 metodeload()
jika harus mengambil item di belakang halaman saat ini.nextKey
: Kunci yang digunakan oleh metodeload()
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
denganpageSize
dariITEMS_PER_PAGE
dan placeholder dinonaktifkanPagingSourceFactory
yang menyediakanMoviesPagingSource
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.
Check my repository for full implementation.
thank you. 🎉