Android 無限列表,RecyclerView 搭配 Android Paging Library

屏東龜山步道-山頂拍攝的風景

Android 提供了 RecyclerView 元件,讓開發者能輕鬆建立列表,但在某些時候資料量很大,沒辦法一次載入所有的資料,需要分批載入資料,這時後怎麼辦呢?

Android 官方提供了 Paging Library 幫助開法者解決相關的問題,Paging Library 提供 RecyclerView 分頁讀取資料的功能,讓資料列表分批載入,達到無限列表的功能,非常的強大,今天來簡單介紹Paging Library!

Android Paging Library

在 Android 官方文件 Paging Library Overview 中開頭說了

The Paging Library makes it easier for you to load data gradually and gracefully within your app’s RecyclerView.

Paging Library 搭配您 App 的 RecyclerView,讓逐步且優雅地加載數據更輕鬆。

分頁需求

使用 RecyclerView 時,會一次的將資料先預載進來並顯示在畫面上,但顯示在畫面上的資料其實只有資料集的一小部分,如果一次載進來的資料量很大,載入的時間拉長,就會造成使用者的體驗不好.

Android Jetpack: manage infinite lists with RecyclerView and Paging (Google I/O ‘18)

換個方式思考,如果可以載入一次夠顯示的資料就好,等到列表快滑到底的時候,再去拿後續的資料,這樣能降低載入的時間,也能避免資源的浪費.

Paging Library 協助解決這個問題,一次只拿一小部分的資料,當資料快不夠給 RecyclerView 顯示時,Paging Library 會加載新的資料,讓列表繼續顯示資料.

加入 Paging Library

官方Paging的架構圖

使用 Paging Library 需要做的事

使用 MVVM 架構要搭配 Paging Library 只需要做三件事:

  1. RecyclerView 的 Adapter 改為繼承 PagedListAdapter
  2. 建立 DataSource.Factory
  3. 建立 DataSource

各個 DataSource

Paging Library 中提供了三種 DataSource,以下是 Hank 認為的使用時機

ItemKeyedDataSource

使用時機:當RecyclerView資料Item的Key有連續性,可根據資料的Key找到上一筆或下一筆資料

PageKeyedDataSource

使用時機:原始資料來源(遠端Server或其他資料來源)已有分頁功能,根據每頁的Key取得資料

PositionalDataSource

使用時機:根據RecyclerView的絕對位置決定放資料

學習資源

Google提供的說明影面

[YouTube]Android Jetpack: Paging

[YouTube]Android Jetpack: manage infinite lists with RecyclerView and Paging (Google I/O ‘18)

[Android Developers] Paging library overview

[Codelab]Learn how to add the Paging Library to an app, step by step.

[Google Samples] PagingWithNetwork sample

千言萬語不如直接看Code:GitHub程式範例

範例使用一個類似數線個方式顯示 RecyclerView,往下拉是正整數,往上拉是負整數,當項目快不夠顯示時,Paging Library 會透過 DataSource 自動加載資料。

結語

MVVM 架構加入 Paging Library 只要稍微修改,其實難度不會太高,在使用的感覺上真的像個無限列表,非常地順暢。

如有任何問題或批評指教,歡迎您告訴我!
謝謝各位的觀賞.

--

--

--

Shares Android development and Kotlin programming.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Hank Li

Hank Li

Shares Android development and Kotlin programming.

More from Medium

Dialog in Android Jetpack Compose with MVVM

Out with Retrofit and in with KTor Client

Jetpack Compose for Views developers — LinearLayout

RecycleView Kotlin — Android Studio