ページングライブラリの使い方を概観
本連載は、Android Jetpackを紹介しています。今回は、大量のデータを効率よく扱えるページングライブラリを解説します。本節ではまず、ページングライブラリの使い方を概観しておきましょう。
なお、今回のサンプルデータは、GitHubから参照できます。
ページングライブラリの登場クラス
RecyclerViewを利用して、画面にデータをリスト表示させることを考えます。図1はその一例として、電話番号とその電話番号の管理IDを表示させるリスト画面です。
 
その際、表示データが数十件ならば、あらかじめ全データをアダプタにセットしてしまっても問題ありません。しかし、データ件数が数百件となると、パフォーマンスの問題が生じてきます。その場合は、あらかじめ最初の数十件だけをアダプタが保持している状態として、ユーザがスクロールしていくのに応じて、追加でデータを読み込むのが現実的な処理と言えます。つまり、ページングです。
こういったページング機能を簡単に実現できるように、Androidにはページングライブラリが用意されています。このライブラリを利用する場合、コーディングの段階で図2のオブジェクトが登場します。
 
これらの登場オブジェクトを簡単にまとめると、表1の通りです。
| クラス名 | 内容 | 生成箇所 | 
| PagingSource | リストデータをページに分割し、その制御を行うオブジェクト | リポジトリ | 
| PagingConfig | ページ分割に関する設定情報を保持したオブジェクト | ViewModel | 
| Pager | PagingSourceとPagingConfigをもとにPagingDataを生成し、リアクティブデータを実現するオブジェクト | ViewModel | 
| PagingData | Pagerによって生成されるFlowオブジェクトの構成要素となるオブジェクト | ViewModel | 
| DiffUtil.ItemCallback | 2種のアイテム間の差異を調べるオブジェクト | アクティビティなど | 
| PagingDataAdapter | ページングライブラリを利用する際のRecyclerViewのアダプタオブジェクト | アクティビティなど | 
表1(図2)のクラスの他に、リストデータ1件分(アイテム)を表すエンティティ、RecyclerViewで利用するビューバインダが必要です。
ページングライブラリの利用準備
次節以降、表1のオブジェクトのコーディング方法を紹介していきますが、そもそもページングライブラリを利用したプロジェクトの場合は、あらかじめその設定を行っておく必要があります。これは、build.gradle.kts(:app)ファイルのdependenciesブロックへの、リスト1の(1)のコードの追記です。なお、pagingVersionのバージョン番号は、原稿執筆時点での番号です。最新バージョンに関しては、こちらのページを参照してください。
また、リスト表示させるデータをデータベースから取得する場合、ページングライブラリでは、Roomの利用を前提としています。その場合は、連載第2回で紹介したRoomを利用するためのライブラリ依存関係の追記とともに(2)のライブラリも必要です。次節以降で紹介するサンプルではRoomを利用していきますので、(2)のライブラリは必要です。
val pagingVersion = "3.3.2"  // (1)
implementation("androidx.paging:paging-runtime:$pagingVersion")  // (1)
implementation("androidx.room:room-paging:$roomVersion")  // (2)

 
              
               
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                          
                           
                              
                               
                              
                               
                              
                               
                              
                               
                              
                               
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
                      
                     
															
														 
															
														.png) 
     
     
     
     
     
													 
													 
													 
													 
													 
										
									
 
 
                     
                    