Paging LibraryはRoomだけではなくAPIでも使えるので、実際に簡単なサンプルを作って試しました。
build.gradle
Versionは1.0.0-alpha4–1 使っています。
implementation "android.arch.paging:runtime:1.0.0-alpha4-1"
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
DataSource
まずはデータを取得する箇所からです。
DataSourceには PageKeyedDataSource
, ItemKeyedDataSource
, PositionalDataSource
の3つが用意されています。
今回は PageKeyedDataSource
を使って実装します。実際の取得とかは省略してます。(後のほうにサンプルリポジトリのリンクあるのでそっちを見てください)
3つのメソッドを使う必要があります。それぞれCallbackが渡されてるので、そこに結果と前/次ページの情報を渡してあげます。
前/次のページがもう存在しない場合は、nullを渡してあげると、それ以上ページングしないようになります。
Genericsでページングにしようするキーの型は指定できます。今回はIntにしていますが、例えば、APIが次のページのidを返すような場合でもGenericsをStringにして、Callbackの前/次ページにそのidを渡すようにすれば良いです。
DataSource.Factory
次にFactoryです。これは単純に先程つくったDataSourceを返すようにします。
ViewModel
ここまで出来たら後は通常のPaging Libraryの使い方と同じです。
PagedListAdapter
等の使い方は省略しますが、この repos
というLiveDataをObserveして渡される値をAdapterにセットします。
これを実行するとスクロールしたら自動で次のページを取得するようなリストが出来ます。
Sample Repository
作ったサンプルはここに上げています。エラー処理とかほとんどやってないのですが…
Googleのサンプルがあったのですが、分かりにくかったので色々削ぎ落としました。
まとめ
DataSourceさえ作れれば、簡単にページングの処理が可能になります。
うまく利用すれば、Paging Libraryだいぶ便利です。