Paging 3 の変更点

Paging 3がようやくリリースされましたので変更点についてまとめていきたいと思います。

Kenji Abe
6 min readJun 13, 2020
Photo by ASHLEY EDWARDS on Unsplash

ぼく個人にとって待ちわびたPaging 3がようやくリリースされました。これまでのPagingと異なり大幅な変更が加えられています。
これらの変更についてまとめていきたいと思います。

ドキュメントが充実してるのでそちらも参考にしてみてください。

※Paging 3はJava/RxJava・Guavaでも実装可能ですが、今回は試していません。

ネットワーク通信と組み合わせることを想定しての解説になります。

今回の環境は 3.0.0-alpha01 になります。

Kotlin

Paging 3は現時点ではJetpackの中で唯一すべてKotlinで書かれています。Javaからももちろん使用可能ではあります。

Coroutines / Flowが全面的に使用されています。

基本的な実装

以前と異なり大幅に簡単になっています。

以前は実装する際に様々なクラスを定義する必要がありました。Roomと連携する際はそこまで難しくはないものですが、API通信などと連携する場合は格段にハードルが上がってしまいます。

以下に簡単な基本的な実装方法を説明します。

PagingSource

こちらは実際にページングのデータ取得の処理を実装する箇所になります。

以前のバージョンでは、 PageKeyedDataSourceDataSource.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.refreshLoadState.Loading のときにロード中になります。また、 LoadState.Error のときはロード中にエラーが発生したことになります。

ページング中ローディング・エラー対応

次に、ページングのローディングです。こちらは LoadStateAdapter を継承したAdapterを作ることで簡単に表示することができます。

色々と省略してますが、 onBindViewHolder の引数に LoadState が渡されることで簡単に判定することができます。

このAdapterを PagingDataAdapter に以下のように渡すことでローディング中やエラーのときは自動でこのAdapterが表示されます。

Fotter以外にも前ページを読み込むヘッダーも同じように設定することができます。

ちょっと分かりにくいのですが、 withLoadStateFooter は内部的には MergeAdapter を返すようになってるので、これを更にRecyclerViewのAdpaterにセットしてあげる必要があります。

以前のPagingではこのあたりの処理が非常に複雑かつ面倒でしたが、相当簡単になっています。

リトライ処理

エラー発生時のリトライ処理も非常に簡単です。

PagingDataAdapterretry メソッドを呼ぶだけです。初回ローディングなのか何ページ目なのか、などを気にしなくて良いので非常に簡単です。

Transformation

Pager からFlowを作る際に途中でデータを変換することが可能になっています。 PagingDatamapfilter などが可能になっています。

これにより、表示しやすいようにデータを加工することが簡単に行えます。

キャッシュ

cachedIn を使うと引数に渡した CoroutineScope の間キャッシュしてくれるようになります。

未対応の部分

以前のPagingもそうでしたが、まだデータの削除や追加には対応していません。

IssueTracker にはすでにあがっているので今後対応してくれるかもしれません。Starを押しておくと良いかもです。

まとめ

以前に比べてだいぶ簡単に実装できるようになっていて使いやすくなっています。また、ドキュメントもしっかりしていますし、マイグレーションについて書いてあります。

まだPaging 3のすべてを試したわけではないので、また何かあれば共有したいと思います。

サンプル

以前のバージョンで作っていたサンプルを今回Paging 3アップデートとプロジェクト全体を最新にしました。

--

--

Kenji Abe
Kenji Abe

Written by Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO

No responses yet