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

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

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

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

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

設定

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

Kotlin

dependencies {
  val paging_version = "3.4.2"

  implementation("androidx.paging:paging-common:$paging_version")

  // Jetpack Compose integration
  implementation("androidx.paging:paging-compose:$paging_version")
}

Groovy

dependencies {
  def paging_version = "3.4.2"

  implementation "androidx.paging:paging-common:$paging_version"

  // Jetpack Compose integration
  implementation "androidx.paging:paging-compose:$paging_version"
}

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

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

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

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

リポジトリ レイヤ

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

他に使用可能なページング ライブラリ コンポーネントには、RemoteMediator があります。RemoteMediator オブジェクトは、ローカル データベース キャッシュを使用するネットワーク データソースなど、階層化されたデータソースからのページングを処理します。

ViewModel レイヤ

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

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

UI レイヤ

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

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

@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()
            }
        }
    }
}

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