ページング ライブラリの概要   Android Jetpack の一部。

ページング ライブラリを使用すれば、大規模なデータセットからデータのページをローカル ストレージやネットワーク経由で読み込んで表示できます。このアプローチにより、アプリはネットワーク帯域幅とシステム リソースの両方をより効率的に使用できます。ページング ライブラリのコンポーネントは、推奨の Android アプリ アーキテクチャに適合し、他の Jetpack コンポーネントと正常に統合され、充実した Kotlin サポートを提供するように設計されています。

ページング ライブラリを使用する利点

ページング ライブラリには以下の機能があります。

  • ページング データに対するメモリ内キャッシュ。アプリがページング データを操作しながら、システム リソースを効率的に使用できるようにします。
  • 組み込みのリクエスト重複除去。アプリでネットワーク帯域幅とシステム リソースを効率的に使用できるようにします。
  • Kotlin コルーチン、フロー、Jetpack Compose の組み込みサポート。
  • 更新機能や再試行機能など、エラー処理の組み込みサポート。
  • TestPager や asSnapshot などの専用のテスト ユーティリティ。ページング ソースとデータ変換を検証します。

設定

Paging コンポーネントを Android アプリにインポートするには、次の依存関係をアプリの build.gradle ファイルに追加します。

Kotlin

dependencies {
  val paging_version = "3.5.3"

  // Needed for Android Views and LiveData. Optional if only using
  // paging-compose
  implementation("androidx.paging:paging-runtime:$paging_version")

  // Needed to collect PagingData flows in Jetpack Compose
  implementation("androidx.paging:paging-compose:$paging_version")

  // Needed to test PagingSource and PagingData transformations in isolation
  testImplementation("androidx.paging:paging-testing:$paging_version")
}

Groovy

dependencies {
  def paging_version = "3.5.3"

  // Needed for Android Views and LiveData. Optional if only using
  // paging-compose
  implementation "androidx.paging:paging-runtime:$paging_version"

  // Needed to collect PagingData flows in Jetpack Compose
  implementation "androidx.paging:paging-compose:$paging_version"

  // Needed to test PagingSource and PagingData transformations in isolation
  testImplementation "androidx.paging:paging-testing:$paging_version"
}

ライブラリのアーキテクチャ

ページング ライブラリ コンポーネントは、アプリの 3 つのレイヤで動作します。

  • リポジトリ レイヤ
  • ViewModel レイヤ
  • UI レイヤ
リポジトリ レイヤの PagingSource または RemoteMediator コンポーネントから、ViewModel レイヤの Pager コンポーネントにページングされたデータフローを示す画像。
    その後、Pager コンポーネントが PagingData のフローを UI レイヤの遅延レイアウト コンポーネントに公開します。
図 1. ページング ライブラリがアプリのアーキテクチャにどのように適合するかを示す例。

このセクションでは、各レイヤで動作するページング ライブラリ コンポーネントについて、およびそれらがどのように連携してページング データの読み込みと表示を行うかについて説明します。

リポジトリ レイヤ

リポジトリ レイヤのメインのページング ライブラリ コンポーネントは PagingSource です。各 PagingSource オブジェクトは、データのソースと、そのソースからデータを取得する方法を定義します。PagingSource オブジェクトを使用すると、ネットワーク ソースやローカル データベースなど、任意の単一ソースからデータを読み込めます。

使用できるもう 1 つの Paging ライブラリ コンポーネントは RemoteMediator です。RemoteMediator オブジェクトは、ローカル データベース キャッシュを使用するネットワーク データソースなど、階層化されたデータソースからのページングを処理します。

ViewModel レイヤ

Pager コンポーネントは、PagingSource オブジェクトと PagingConfig 構成オブジェクトに基づいて、リアクティブ ストリームで公開される PagingData のインスタンスを構築するための公開 API を提供します。

ViewModel レイヤを UI に接続するコンポーネントは、PagingData です。PagingData オブジェクトは、ページングされたデータのスナップショットのコンテナです。PagingSource オブジェクトをクエリし、結果を保存します。

UI レイヤ

主要な Paging UI API は collectAsLazyPagingItems() です。ページ分けされたアイテムを、Compose の遅延レイアウト コンポーネント(LazyColumn や LazyRow など)で簡単に使用できるデータのリストとして公開します。

androidx.paging:paging-compose ライブラリを追加して、Compose 互換の API を使用します。これにより、アダプターや差分ロジックを必要とせずに、UI がデータの読み込み、更新、エラーに自動的に対応できるようになります。Flow<PagingData> で collectAsLazyPagingItems() 拡張関数を使用して、返された LazyPagingItems を LazyColumn の items() に渡します。

@Composable
fun MessageList(pager: Pager<Int, Message>) {
    val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it.id }
        ) { index ->
            val message = lazyPagingItems[index]
            if (message != null) {
                MessageRow(message)
            } else {
                MessagePlaceholder()
            }
        }
    }
}

詳細については、大規模なデータセット(ページング)をご覧ください。