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

換個方式思考,如果可以載入一次夠顯示的資料就好,等到列表快滑到底的時候,再去拿後續的資料,這樣能降低載入的時間,也能避免資源的浪費.
Paging Library 協助解決這個問題,一次只拿一小部分的資料,當資料快不夠給 RecyclerView 顯示時,Paging Library 會加載新的資料,讓列表繼續顯示資料.
加入 Paging Library

使用 Paging Library 需要做的事
使用 MVVM 架構要搭配 Paging Library 只需要做三件事:
- RecyclerView 的 Adapter 改為繼承 PagedListAdapter
- 建立 DataSource.Factory
- 建立 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 只要稍微修改,其實難度不會太高,在使用的感覺上真的像個無限列表,非常地順暢。
如有任何問題或批評指教,歡迎您告訴我!
謝謝各位的觀賞.