Paging 3 の変更点
ぼく個人にとって待ちわびたPaging 3がようやくリリースされました。これまでのPagingと異なり大幅な変更が加えられています。
これらの変更についてまとめていきたいと思います。
ドキュメントが充実してるのでそちらも参考にしてみてください。
※Paging 3はJava/RxJava・Guavaでも実装可能ですが、今回は試していません。
ネットワーク通信と組み合わせることを想定しての解説になります。
今回の環境は 3.0.0-alpha01
になります。
Kotlin
Paging 3は現時点ではJetpackの中で唯一すべてKotlinで書かれています。Javaからももちろん使用可能ではあります。
Coroutines / Flowが全面的に使用されています。
基本的な実装
以前と異なり大幅に簡単になっています。
以前は実装する際に様々なクラスを定義する必要がありました。Roomと連携する際はそこまで難しくはないものですが、API通信などと連携する場合は格段にハードルが上がってしまいます。
以下に簡単な基本的な実装方法を説明します。
PagingSource
こちらは実際にページングのデータ取得の処理を実装する箇所になります。
以前のバージョンでは、 PageKeyedDataSource
や DataSource.Factory
などを実装する必要があり、実装にはハードルがそれなりにありました。
Paging 3では PagingSource
というのもを実装するだけです。以下に例をあげます。
これだけで取得の部分の実装は終わりです。
Pager
次にViewModel等からページング処理されたデータを取得する方法です。 Pager
というものを使います。
この Pager
から Flow
が取得できますので、 Flow
から表示するデータを取得できます。
Adapter
Paging 3では PagingDataAdapter
を継承して実装するだけで、通常のRecyclerViewの実装とほぼ変わらないので、省略します。
Activity / Fragment
あとはActivityやFragmentからViewModelから取得した Flow
をAdapterにセットしてあげるだけです。
最終的に扱うのは PagingData
というものになります。
単純な実装としてはこんな感じになります。
Paging 3には実装が他にも色々な機能があります。
初回ローディング・エラーの対応
Paging 3ではローディングとエラーの状態も管理してくれます。これが非常に便利です。
まず初回のローディングです。こちらは PagingDataAdapter
が持っている loadStateFlow
を使ってローディング状態を判定することができます。
ラムダ式に渡される loadState.refresh
が LoadState.Loading
のときにロード中になります。また、 LoadState.Error
のときはロード中にエラーが発生したことになります。
ページング中ローディング・エラー対応
次に、ページングのローディングです。こちらは LoadStateAdapter
を継承したAdapterを作ることで簡単に表示することができます。
色々と省略してますが、 onBindViewHolder
の引数に LoadState
が渡されることで簡単に判定することができます。
このAdapterを PagingDataAdapter
に以下のように渡すことでローディング中やエラーのときは自動でこのAdapterが表示されます。
Fotter以外にも前ページを読み込むヘッダーも同じように設定することができます。
ちょっと分かりにくいのですが、 withLoadStateFooter
は内部的には MergeAdapter
を返すようになってるので、これを更にRecyclerViewのAdpaterにセットしてあげる必要があります。
以前のPagingではこのあたりの処理が非常に複雑かつ面倒でしたが、相当簡単になっています。
リトライ処理
エラー発生時のリトライ処理も非常に簡単です。
PagingDataAdapter
の retry
メソッドを呼ぶだけです。初回ローディングなのか何ページ目なのか、などを気にしなくて良いので非常に簡単です。
Transformation
Pager
からFlowを作る際に途中でデータを変換することが可能になっています。 PagingData
は map
や filter
などが可能になっています。
これにより、表示しやすいようにデータを加工することが簡単に行えます。
キャッシュ
cachedIn
を使うと引数に渡した CoroutineScope の間キャッシュしてくれるようになります。
未対応の部分
以前のPagingもそうでしたが、まだデータの削除や追加には対応していません。
IssueTracker にはすでにあがっているので今後対応してくれるかもしれません。Starを押しておくと良いかもです。
まとめ
以前に比べてだいぶ簡単に実装できるようになっていて使いやすくなっています。また、ドキュメントもしっかりしていますし、マイグレーションについて書いてあります。
まだPaging 3のすべてを試したわけではないので、また何かあれば共有したいと思います。
サンプル
以前のバージョンで作っていたサンプルを今回Paging 3アップデートとプロジェクト全体を最新にしました。