Paging

Paging ライブラリを使用すると、アプリの RecyclerView 内でデータを段階的かつ適切に読み込むことが容易になります。

androidx.paging グループ内のすべてのアーティファクトのリストを以下に示します。

アーティファクト 安定版リリース リリース候補版 ベータ版リリース アルファ版リリース
paging-* 3.2.1 - - 3.3.0-alpha05
paging-compose 3.2.1 - - 3.3.0-alpha05
このライブラリの最終更新日: 2024 年 3 月 20 日

依存関係の宣言

Paging への依存関係を追加するには、Google の Maven リポジトリをプロジェクトに追加する必要があります。詳しくは、Google の Maven リポジトリをご覧ください。

アプリまたはモジュールの build.gradle ファイルに、必要なアーティファクトの依存関係を追加します。

Groovy

dependencies {
  def paging_version = "3.2.1"

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

  // alternatively - without Android dependencies for tests
  testImplementation "androidx.paging:paging-common:$paging_version"

  // optional - RxJava2 support
  implementation "androidx.paging:paging-rxjava2:$paging_version"

  // optional - RxJava3 support
  implementation "androidx.paging:paging-rxjava3:$paging_version"

  // optional - Guava ListenableFuture support
  implementation "androidx.paging:paging-guava:$paging_version"

  // optional - Jetpack Compose integration
  implementation "androidx.paging:paging-compose:3.3.0-alpha05"
}

Kotlin

dependencies {
  val paging_version = "3.2.1"

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

  // alternatively - without Android dependencies for tests
  testImplementation("androidx.paging:paging-common:$paging_version")

  // optional - RxJava2 support
  implementation("androidx.paging:paging-rxjava2:$paging_version")

  // optional - RxJava3 support
  implementation("androidx.paging:paging-rxjava3:$paging_version")

  // optional - Guava ListenableFuture support
  implementation("androidx.paging:paging-guava:$paging_version")

  // optional - Jetpack Compose integration
  implementation("androidx.paging:paging-compose:3.3.0-alpha05")
}

Kotlin 拡張機能の使用方法については、ktx のドキュメントをご覧ください。

依存関係について詳しくは、ビルド依存関係の追加をご覧ください。

フィードバック

お寄せいただいたフィードバックは Jetpack 改善の参考にさせていただきます。新しい問題が見つかった場合や、このライブラリを改善するアイデアをお持ちの場合は、お知らせください。新しい問題を報告していただく前に、このライブラリの既存の問題をご確認ください。スターボタンをクリックすると、既存の問題に投票できます。

新しい問題を報告する

詳細については、Issue Tracker のドキュメントをご覧ください。

バージョン 3.3

バージョン 3.3.0-alpha05

2024 年 3 月 20 日

androidx.paging:paging-*:3.3.0-alpha05 がリリースされました。バージョン 3.3.0-alpha05 に含まれる commit については、こちらをご覧ください。

API の変更

  • ページングで、一般的なコードに AndroidX アノテーション @MainThread アノテーションが使用されるようになりました。(I78f0db/327682438

バージョン 3.3.0-alpha04

2024 年 3 月 6 日

androidx.paging:paging-*:3.3.0-alpha04 がリリースされました。バージョン 3.3.0-alpha04 に含まれる commit については、こちらをご覧ください。

バグの修正

  • Kotlin マルチプラットフォーム互換性の追加に関連する軽微なドキュメント エラーを修正しました。(aosp/2950785

バージョン 3.3.0-alpha03

2024 年 2 月 7 日

androidx.paging:paging-*:3.3.0-alpha03 がリリースされました。バージョン 3.3.0-alpha03 に含まれる commit については、こちらをご覧ください

新機能

  • PagingDataPresenter がパブリック クラスになりました。内部の Paging API や paging-runtimeAsyncPagingDataDiffer を使用することなく、PagingDataPresenter 上にマルチプラットフォーム プレゼンターを構築できるようになりました。(Id1f74b/315214786
  • LoadStates がエラー状態か NotLoading 状態かをチェックする、新しい LoadStates および CombinedLoadStates ヘルパー メソッドを追加しました。また、読み込みが NotLoading 状態またはエラー状態に解決するまで LoadStateFlow を待機する新しい API を追加しました。(Id6c67

動作の変更

  • PagingData.empty() は、カスタム LoadStates がコンストラクタに渡されていない限り、デフォルトで NotLoading 状態をディスパッチするようになりました。これは、PagingDataAdapter に送信されたときに LoadStates をディスパッチしない、または LazyPagingItems として収集されると読み込み状態をディスパッチする既存の動作とは異なります。LazyPagingItems として収集されると、初回コンポーズの直後に空のリストも表示されるようになりました。(I4d11db/301833847

バージョン 3.3.0-alpha02

2023 年 9 月 20 日

androidx.paging:paging-*:3.3.0-alpha02 がリリースされました。バージョン 3.3.0-alpha02 に含まれる commit については、こちらをご覧ください

Kotlin マルチプラットフォームの互換性

Paging では、Kotlin マルチプラットフォームと互換性のあるアーティファクトが提供されるようになりました。これは主に、CashApp のマルチプラットフォーム ページング プロジェクトのアップストリーム作業によるものです。これにより、2 つのリポジトリ間の不一致を回避し、互換性を維持できます。

  • paging-common ですべての Paging 3 API が common に移行され、Android に加えて jvm と iOS にも対応するようになりました。
  • paging-testing のコードは common に移動し、Android に加えて JVM と iOS にも対応するようになりました。
  • paging-compose のコードを common に移動し、androidx.compose のマルチプラットフォーム サポートと一致する Android アーティファクトをリリースしました。
  • paging-runtimepaging-guavapaging-rxjava2paging-rxjava3 は引き続き Android のみとなります。

API の変更

  • 内部使用のみを目的としていたパブリック Logger インターフェースが非推奨になりました。(I16e95b/288623117

外部からの協力

バージョン 3.3.0-alpha01

2023 年 9 月 20 日

  • これは、androidx.paging ライブラリの最初のマルチプラットフォーム リリースです。このバージョンには、*-jvm アーティファクトと *-android アーティファクトのみがあります。macOS、iOS、linux の場合は、3.3.0-alpha02 を使用します。

バージョン 3.2

バージョン 3.2.1

2023 年 9 月 6 日

androidx.paging:paging-*:3.2.1 がリリースされました。バージョン 3.2.1 に含まれる commit については、こちらをご覧ください

バグの修正

  • asSnapshot() には読み込みの完了に関する情報がないため(PagingData.from(List, LoadStates) オーバーロードとは異なり)、PagingData.from(List) を使用してビルドされた Flow を渡すと、Paging Testing アーティファクトの asSnapshot() API がハングする問題を修正しました。この回避策は、完了可能な Flow(flowOf(PagingData.from(...)) など)でのみ機能します。完了できない Flow(例:MutableStateFlow: LoadStates を提供する PagingData.from オーバーロードを使用します。(I502c3
  • Paging Compose が内部的に AndroidUiDispatcher.Main を使用して、読み込み完了と同じフレームで新しいデータが利用できるようにしました。(Ia55af

バージョン 3.2.0

2023 年 7 月 26 日

androidx.paging:paging-*:3.2.0 がリリースされました。バージョン 3.2.0 に含まれる commit については、こちらをご覧ください

3.1.0 以降の重要な変更

  • Paging Compose が API の安定性を獲得し、Paging の他の部分に統合され、そのバージョンが他のすべての Paging アーティファクトと一致するようになりました。3.1.0 以降の変更点は次のとおりです。
    • PagingData.from(fakeData) を作成し、その PagingDataMutableStateFlowMutableStateFlow(PagingData.from(listOf(1, 2, 3))) など)でラップすることで、架空のデータのリストをプレビューできるようになりました。このフローを、プレビューする collectAsLazyPagingItems() のレシーバとして @Preview コンポーザブルに渡します。
    • LazyVerticalGridHorizontalPager などのすべての遅延レイアウトと、Wear および TV ライブラリのカスタム Lazy コンポーネントをサポートします。これは、新しい下位レベルの LazyPagingItems 拡張メソッド itemKeyitemContentType を通じて実現されています。これにより、LazyColumnLazyVerticalGrid にすでに存在する標準の items API や HorizontalPager などの API の同等のものに、key パラメータと contentType パラメータを実装できます。
    • LazyListScope のみをサポートする items(lazyPagingItems)itemsIndexed(lazyPagingItems) が非推奨になりました。
  • 新しい paging-testing アーティファクト。アプリの各レイヤの単体テストと、分離された Paging との統合を中心に設計された API を提供します。たとえば、次のものが含まれます。
    • TestPager クラスを使用すると、ページャーや実際の UI から独立して、独自のカスタム PagingSource 実装の動作を検証できます。
    • Flow<List<Value>> または静的な List<Value> を、テストで Pager に渡すことができる PagingSourceFactory に変換する asPagingSourceFactory API
    • Flow<PagingData<Value>>asSnapshot Kotlin 拡張機能。Flow<PagingData<Value>> を直接 List<Value> に変換します。asSnapshot lambda を使用すると、scrollToappendScrollWhile などの API を介してアプリの UI を模倣できるため、ページング データセット内の任意の時点でデータのスナップショットが正しいことを確認できます。
  • Paging のデバッグ情報を VERBOSEDEBUG の 2 つのレベルで公開するためのデフォルトのログを追加しました。ログを有効にするには、adb shell setprop log.tag.Paging [DEBUG|VERBOSE] コマンドを使用します。これは、ビューを使用する Paging と Compose を使用する Paging の両方に適用されます。
  • CoroutineDispatcher の代わりに CoroutineContext を受け入れる PagingDataAdapterAsyncPagingDataDiffer のコンストラクタを追加しました。
  • 以前の () -> PagingSource ラムダよりも明示的な API サーフェスを提供する新しい PagingSourceFactory 関数インターフェースを追加しました。このファクトリを使用して、Pager をインスタンス化できます。

バージョン 3.2.0-rc01

2023 年 6 月 21 日

androidx.paging:paging-*:3.2.0-rc01 がリリースされました。バージョン 3.2.0-rc01 に含まれる commit については、こちらをご覧ください

外部からの協力

  • Paging を Android/JVM の仕様から移行することにご協力いただいた Veyndan 氏に感謝いたします。(#553#554#555#559

バージョン 3.2.0-beta01

2023 年 6 月 7 日

androidx.paging:paging-*:3.2.0-beta01 がリリースされました。バージョン 3.2.0-beta01 に含まれる commit については、こちらをご覧ください

ページング Compose

  • Paging Compose が API の安定性を正式に達成しました。そのため、バージョンは 1.0.0-alpha20 から更新され、他のすべての Paging アーティファクトのバージョンと一致するようになりました。

API の変更

バージョン 3.2.0-alpha06

2023 年 5 月 24 日

androidx.paging:paging-*:3.2.0-alpha06 がリリースされました。バージョン 3.2.0-alpha06 に含まれる commit については、こちらをご覧ください

新機能

  • 既存の () -> PagingSource ラムダよりも明示的な API サーフェスを提供する、新しい PagingSourceFactory 関数インターフェースを追加しました。このファクトリを使用して、Pager をインスタンス化できます。(I33165b/280655188
  • データの不変リストからのみ読み込まれる PagingSourceFactory を取得するための、List<Value>.asPagingSourceFactory() の新しい paging-testing API を追加しました。複数世代の静的データでのテストには、引き続き Flow<List<Value>> の既存の拡張機能を使用する必要があります。(Id34d1b/280655188

API の変更

  • ページング テストのすべての公開 API には、これらの API がテストでのみ使用されるように、@VisibleForTesting アノテーションが付けられるようになりました。(I7db6e
  • asSnapshot API で CoroutineScope を渡す必要がなくなりました。デフォルトでは、親スコープから継承されたコンテキストが使用されます。(Id0a78b/282240990
  • 実際の Pager コンストラクタ パラメータの順序に直感的に一致するように TestPager コンストラクタ パラメータの順序を変更しました。(I6185a
  • ページング テストでのラムダ型 () -> PagingSource<Key, Value> の使用を PagingSourceFactory<Key, Value> 型に移行しました。(I4a950b/280655188

動作の変更

  • メイン ディスパッチャで asSnapshot ページング テストを実行する必要がなくなりました。この設定を行っても、テストの動作は変更されません。(Ie56ea

バージョン 3.2.0-alpha05

2023 年 5 月 3 日

androidx.paging:paging-*:3.2.0-alpha05 がリリースされました。バージョン 3.2.0-alpha05 に含まれる commit については、こちらをご覧ください

API の変更

  • asSnapshot の Paging Testing API で、loadOperations パラメータがデフォルトで空のラムダに設定されるようになりました。これにより、読み込みオペレーションを渡さずに asSnapshot を呼び出し、最初の更新読み込みからデータを取得できます。(Ied354b/277233770

ドキュメントの改善

  • asPagingSourceFactory() のドキュメントを更新し、PagingSource インスタンスを生成するための再利用可能なファクトリを返す Flow の拡張メソッドであることを明確にしました。(I5ff4fI705b5
  • LoadResult.Page コンストラクタのドキュメントを更新し、ジャンプをサポートするために itemsBeforeitemsAfter をオーバーライドする必要性を明確にしました。(Ied354

外部からの協力

バージョン 3.2.0-alpha04

2023 年 2 月 8 日

androidx.paging:paging-*:3.2.0-alpha04 がリリースされました。バージョン 3.2.0-alpha04 に含まれる commit については、こちらをご覧ください

ページング テスト

  • paging-testing アーティファクトに、Pager に渡すために Flow<List<Value>> から pagingSourceFactory を作成する asPagingSourceFactory メソッドが追加されました。フローから出力される各 List<Value>> は、ページングされたデータの生成を表します。これにより、Pager の収集元となるデータソースを偽装することで、PagingData 変換などでのページング テストが容易になります。(I6f230b/235528239
  • paging-testing アーティファクトが拡張され、Flow<PagingData<T>> に含まれるデータが正しいことを確認するのに適した新しい API が追加されました。たとえば、ViewModel レイヤからの Flow<PagingData<T>> の出力をアサートするのに使用できます。

    これは、Flow<PagingData<Value>>asSnapshot Kotlin 拡張機能を介して行われ、Flow<PagingData<Value>> が直接 List<Value> に変換されます。asSnapshot ラムダを使用すると、scrollToappendScrollWhile などの API を介して、繰り返し可能な一貫した方法でアプリの UI を模倣できます。それにより、ページングされたデータセットのスナップショットがどの時点でも正しいことを検証できます。

    // Create your ViewModel instance
    val viewModel = …
    // Get the Flow of PagingData from the ViewModel
    val data< Flow<PagingData<String>> = viewModel.data
    val snapshot: List<String> = data.asSnapshot {
      // Each operation inside the lambda waits for the data to settle before continuing
      scrollTo(index = 50)
    
      // While you can’t view the items within the asSnapshot call,
      // you can continuously scroll in a direction while some condition is true
      // i.e., in this case until you hit a placeholder item
      appendScrollWhile {  item: String -> item != “Header 1” }
    }
    // With the asSnapshot complete, you can now verify that the snapshot
    // has the expected values
    

    asSnapshot は、runTest 内での実行が想定された suspend メソッドです。詳しくは、Android での Kotlin コルーチンのテストをご覧ください。(I55fd2I5bd26I7ce34I51f4dI2249fId6223Ic4babIb29b9Ic1238I96defb/235528239

API の変更

  • AsyncPagingDataDifferPagingDataAdapter における getItempeek への UI 呼び出しが、メインスレッドでのみ呼び出し可能として正しくマークされるようになりました。(I699b6
  • TestPager が使用する汎用型からワイルドカードが削除されました。それにより、Java プログラミング言語で記述されたコードで、これらのメソッドの結果を簡単に使用できるようになりました。(I56c42

バージョン 3.2.0-alpha03

2022 年 10 月 24 日

androidx.paging:paging-*:3.2.0-alpha03 がリリースされました。バージョン 3.2.0-alpha03 に含まれる commit については、こちらをご覧ください

ページング テスト

このリリースには新しいアーティファクト(paging-testing)が含まれています。このアーティファクトは、アプリの各レイヤの単体テストと、独立した Paging との統合を中心に設計された API を提供します。

たとえば、この初回リリースには、エンドツーエンドのページング統合をシミュレーションするために通常必要となる Pager や実際の UI とは別に、独自のカスタム PagingSource 実装の動作を検証できる TestPager クラスが含まれています。

TestPagerとみなす必要があります。これは、Pager の実際の実装をミラーリングし、PagingSource をテストするための簡略化された API サーフェスを提供するテストダブルです。これらの API は suspend API であり、Android での Kotlin コルーチンのテストのガイドで説明されているように runTest 内で実行する必要があります。

これらの API の使用例については、room-paging テストをご覧ください。これは、TestPager を使用するようにリファクタリングされています。

API の変更

  • LoadResult.Page.data から LoadResult.Page.iterator() までの便利なイテレーションを可能にします。これにより、PagingSource.getRefreshKey メソッドに渡される PagingStatepages プロパティなどで List<LoadResult.Page> を指定すると、Kotlin 標準ライブラリ flatten メソッドの使用が間接的に許可されます。(Ie0718

バージョン 3.2.0-alpha02

2022 年 8 月 10 日

androidx.paging:paging-*:3.2.0-alpha02 がリリースされました。バージョン 3.2.0-alpha02 に含まれる commit については、こちらをご覧ください

新機能

  • Paging が AsyncPagingDataDiffer クラスまたは PagingDataAdapter クラスを介してログを提供するようになり、PagingData から収集されたデバッグ情報が公開されるようになりました。
  • ログは、adb shell コマンド adb shell setprop log.tag.Paging [DEBUG|VERBOSE]. を介して有効にできます。(b/235527159

バグの修正

  • ランタイム paging-runtime:3.1.1 以前で paging-common:3.2.0-alpha01 を使用すると発生していた PagingDataDiffer コンストラクタの欠落エラーを修正しました。(b/235256201

バージョン 3.2.0-alpha01

2022 年 6 月 1 日

androidx.paging:paging-*:3.2.0-alpha01 がリリースされました。バージョン 3.2.0-alpha01 に含まれる commit については、こちらをご覧ください

API の変更

  • CoroutineDispatcher の代わりに CoroutineContext を受け入れる PagingDataAdapterAsyncPagingDataDiffer のコンストラクタを追加しました。(Idc878
  • デフォルトで、PagingData.from()PagingData.empty() がプレゼンター側の CombinedLoadStates に影響しなくなります。これらのコンストラクタに sourceLoadStatesremoteLoadStates を渡せる新しいオーバーロードが追加されました。これにより、LoadStates が完全に終了するように設定する(NotLoading(endOfPaginationReached = false) など)という既存の動作を維持しつつ、必要に応じてリモートの状態を含めるというオプションも設定できます。LoadStates が渡されない場合、以前の CombinedLoadStates は静的な PagingData を受け取るとプレゼンター側で維持されます。(Ic3ce5b/205344028

バグの修正

  • null を返すが null 以外の initialKey が設定されている場合に、PagingSource.getRefreshKey() の結果が initialKey よりも適切に優先されるようになりました。(Ic9542b/230391606

外部からの協力

  • test-coroutines-lib の移行により :compose:ui:ui-test API(updateApi)を更新しました。(I3366d

バージョン 3.1

バージョン 3.1.1

2022 年 3 月 9 日

androidx.paging:paging-*:3.1.1 がリリースされました。バージョン 3.1.1 に含まれる commit については、こちらをご覧ください

バグの修正

  • .cachedIn() によって誤って挿入されていた世代間の中間 LoadState.NotLoading イベントを削除しました。この変更により、更新時や無効化時の読み込み失敗を再試行する間に生成されていた冗長な LoadState.NotLoading イベントが削除され、LoadState の変化への対応が非常に簡単になりました。

バージョン 3.1.0

2021 年 11 月 17 日

androidx.paging:paging-*:3.1.0 がリリースされました。バージョン 3.1.0 に含まれる commit については、こちらをご覧ください

3.0.0 以降の重要な変更

  • Flow<PagingData>.observable API と Flow<PagingData>.flowable API は試験運用版ではなくなりました。
  • LoadState の動作の変更:
    • PagingSourceRemoteMediator の両方で、LoadType.REFRESHendOfPaginationReached が常に false になりました。
    • Paging の LoadStates が、ダウンストリームを出力する前に PagingSourceRemoteMediator の有効な値を待つようになりました。新世代の PagingData は、更新状態の場合に誤って NotLoading にリセットされることがなくなり、代わりに常に正しく Loading から開始されるようになりました。
    • プレゼンター API の .loadStateFlow.addLoadStateListener は、常にメディエータ状態が null に設定される初期 CombinedLoadStates を冗長に送信しなくなりました。
  • 以前の世代でのキャンセルは、無効化または新しい世代に対して積極的に行われるようになりました。Flow<PagingData>.collectLatest を使用する必要はなくなりましたが、引き続き使用することをおすすめします。
  • PagingSource.LoadResult.InvalidPagingSource.load の新しい戻り値の型として追加されました。この場合、Paging は、この PagingSource に対する保留中または今後の読み込みリクエストすべて破棄し、無効にします。この戻り値の型は、データベースまたはネットワークから返される可能性がある無効または最新でないデータを処理することを目的としています。
  • ページが UI に表示される場合に同期的にトリガーされる .onPagesPresented.addOnPagesUpdatedListener のプレゼンター API を追加しました。ページの更新は、次のような状況で発生します。
    • 表示されるアイテムの変更が新しい世代に含まれるかどうかにかかわらず、新しい世代の PagingData の初期読み込みが行われる場合。すなわち、リストが完全に同じであるため更新なしで初期読み込みが完了する新しい世代では、このコールバックが引き続きトリガーされます。
    • ページが挿入される場合(挿入されるページに新しいアイテムが含まれていない場合も同様)。
    • ページがドロップされる場合(ドロップされるページが空である場合も同様)。

バージョン 3.1.0-rc01

2021 年 11 月 3 日

androidx.paging:paging-*:3.1.0-rc01 がリリースされました。バージョン 3.1.0-rc01 に含まれる commit については、こちらをご覧ください

バグの修正

  • オブザーバーが存在しない間、またはオブザーバーが新しい PagingData に切り替えている間に、Paging のダウンストリームによって複数の読み込みイベントが送信された場合の .cachedIn() における競合状態とメモリリークを修正しました。(Ib682e

バージョン 3.1.0-beta01

2021 年 10 月 13 日

androidx.paging:paging-*:3.1.0-beta01 がリリースされました。バージョン 3.1.0-beta01 に含まれる commit については、こちらをご覧ください

バグの修正

  • 高速のアイテム アクセスが多いと、prefetchDistance で検討事項としてドロップされ、ページの読み込みが遅くなる問題を修正しました。これは特に、ユーザーのスクロール方向とは逆方向に読み込みが優先される順序で多数のアイテムが一度にレイアウトされる場合に発生する問題です。このようなアイテム アクセスは、ドロップされないように、バッファリングされ同期的に優先されるようになりました。(aosp/1833273

バージョン 3.1.0-alpha04

2021 年 9 月 29 日

androidx.paging:paging-*:3.1.0-alpha04 がリリースされました。バージョン 3.1.0-alpha04 に含まれる commit については、こちらをご覧ください

API の変更

  • Flow<PagingData>.observable API と Flow<PagingData>.flowable API は試験運用版ではなくなりました。(Ie0bdd

バグの修正

  • LoadState の場合、LoadType.REFRESH では endOfPaginationReached が常に false になります。以前は endMediaPaginationReached が、RemoteMediator REFRESH では true になる可能性がありましたが、PagingSource ではその可能性がありませんでした。この動作は、常に false を返すように統合され(REFRESH が終了することは適切でないため)、LoadState の API コントラクトの一部として文書化されるようになりました。ページ分けが終了したかどうかを判断する際は、常に APPEND または PREPEND のいずれかの方向に対して判断する必要があります。(I047b6
  • Paging の LoadState が、世代間でダウンストリームを出力する前に、PagingSource と RemoteMediator の両方の有効な値を待つようになりました。これにより、新しい世代の PagingData が、CombinedLoadStates.source.refresh で NotLoading を送信しないようにしました(すでに Loading 状態にある場合)。新しい世代の PagingData は、NotLoading に誤ってリセットされていたケースに対して、常に正しく Loading から開始されるようになりました。

    以前の世代でのキャンセルは、無効化または新しい世代に対して積極的に行われるようになりました。Flow<PagingData> で .collectLatest を使用する必要はなくなりましたが、引き続き使用することを強くおすすめします。(I0b2b5b/177351336b/195028524

  • プレゼンター API の .loadStateFlow.addLoadStateListener は、初期の CombinedLoadStates(常にメディエータの状態が null に設定され、ソースの状態が NotLoading(endOfPaginationReached = false) に設定される)を冗長化して送信しなくなりました。つまり、次のようになります。

    1. RemoteMediator を使用している場合、常にメディエータの状態が入力されます。
    2. .loadStateFlow で新しい loadState リスナーや新しいコレクタを登録しても、PagingData から実際の CombinedLoadStates を受信していない場合、すぐに現在の値を出力することはありません。これは、PagingData を送信する前にコレクタまたはリスナーが起動した場合に発生することがあります。(I1a748

バージョン 3.1.0-alpha03

2021 年 7 月 21 日

androidx.paging:paging-*:3.1.0-alpha03 がリリースされました。バージョン 3.1.0-alpha03 に含まれる commit については、こちらをご覧ください

API の変更

  • LoadResult の 3 番目の戻り値の型 LoadResult.Invalid が PagingSource に追加されました。PagingSource.load が LoadResult.Invalid を返す場合、ページングが読み込まれたデータを破棄し、PagingSource を無効にします。この戻り値の型は、データベースまたはネットワークから返される可能性がある無効または古いデータを処理するように設計されています。

    たとえば、背後のデータベースが書き込まれたにもかかわらず、PagingSource が時間内で無効にならない場合、その実装が読み込み元のバッキング データセットの不変性に依存している場合は一貫性のない結果を返す場合があります(たとえば LIMIT OFFSET スタイルの DB 実装)。このシナリオでは、読み込み後に無効化をチェックし、LoadResult.Invalid を返すことをおすすめします。これにより、Paging は、この PagingSource への保留中または将来の読み込みリクエストを破棄して無効にします。

    この戻り値の型は、LivePagedList または RxPagedList を利用する Paging2 API でもサポートされています。Paging2 の PagedList API で PagingSource を使用すると、PagedList は直ちに接続解除され、以後この PagedList へのデータの読み込みは停止され、PagingSource で無効化がトリガーされます。

    LoadResult はシールクラスです。つまり、ソース互換性のない変更であり、PagingSource.load の結果を直接使用するユースケースではコンパイル時に LoadResult.Invalid を扱う必要があります。たとえば、網羅的な when で戻り値の型をチェックしている Kotlin ユーザーは、Invalid 型のチェックを追加する必要があります。(Id6bd3b/191806126b/192013267

バグの修正

  • PagingSource.registerInvalidatedCallback または DataSource.addInvalidatedCallback で追加された無効化コールバックは、すでに無効な PagingSource / DataSource に登録されていた場合、自動的にトリガーされるようになりました。これにより、初期読み込み時にすでに無効だった Source が提供されたとき、Paging が無効化シグナルを逃して、停止するという競合状態が解消されます。さらに、無効化コールバックは、確実に 1 回だけ呼び出されるため、トリガーされた後に適切に削除されるようになりました。(I27e69
  • 新しくインスタンス化された PagedList ストリームから、プレースホルダの初期値(InitialPagedList)を送信します。たとえば、LivePagedListBuilder または RxPagedListBuilder は、以前に読み込んだデータを削除しなくなります。

バージョン 3.1.0-alpha02

2021 年 7 月 1 日

androidx.paging:paging-*:3.1.0-alpha02 がリリースされました。バージョン 3.1.0-alpha02 に含まれる commit については、こちらをご覧ください。

新機能

  • 表示されたページが UI で更新された直後にトリガーされる onPagesPresented リスナーおよびフロー プレゼンター API を追加しました。

    この更新は UI と同期されているため、.snapshot、.getItemCount などのアダプター メソッドを呼び出して、更新が適用された後の状態を調べることができます。なお、.snapshot() は更新のたびに呼び出すと高コストになる可能性があるため、明示的に呼び出されたままになっています。

    ページの更新は、次のような状況で発生します。

    • 表示されるアイテムの変更が新しい世代に含まれるかどうかにかかわらず、新しい世代の PagingData の初期読み込みが行われる場合。すなわち、リストが完全に同じであるため更新なしで初期読み込みが完了する新しい世代では、このコールバックが引き続きトリガーされます。
    • ページが挿入される場合(挿入されるページに新しいアイテムが含まれていない場合も同様)
    • ページがドロップされる場合(ドロップされるページが空である場合も同様)(I272c9b/189999634

バグの修正

  • LivePagedList または RxPagedList によって生成された初期値から PagedList.dataSource にアクセスしても、IllegalStateException が誤ってスローされなくなります。(I96707

バージョン 3.1.0-alpha01

2021 年 6 月 2 日

androidx.paging:paging-*:3.1.0-alpha01 がリリースされました。バージョン 3.1.0-alpha01 に含まれる commit については、こちらをご覧ください

API の変更

  • paging-rxjava3 が提供していたクラスを androidx.paging.rxjava3 パッケージ配下に移動し、paging-rxjava2 と競合しないようにしました(Ifa7f6

バグの修正

  • Paging がときどき no-op differ イベントを RecyclerView に送信する問題を修正しました。これにより、特定のリスナーが早期にトリガーされていました。(Ic507fb/182510751

外部からの協力

  • サポートが終了している PagedList compat API を rxjava3 のアーティファクトに追加しました(Id1ce2b/182497591

Paging Compose バージョン 1.0.0

バージョン 1.0.0-alpha20

2023 年 5 月 24 日

androidx.paging:paging-compose:1.0.0-alpha20 がリリースされました。バージョン 1.0.0-alpha20 に含まれる commit については、こちらをご覧ください。

新機能

  • Paging Compose で、PagingData.from(fakeData) を作成してその PagingDataMutableStateFlowMutableStateFlow(PagingData.from(listOf(1, 2, 3))))。そのデータを @Preview への入力として使用することで、collectAsLazyPagingItems() を呼び出すと、プレビュー可能な LazyPagingItems が提供されます。(I8a78db/194544557

バグの修正

  • LazyPagingItems で収集された pager.flow.cachedIn のキャッシュ データは、状態の復元後、非同期収集なしですぐに利用できるようになりました。つまり、状態が復元された後、キャッシュされたデータは最初のコンポーズ後すぐに表示の準備が整います。(I97a60b/177245496

バージョン 1.0.0-alpha19

2023 年 5 月 3 日

androidx.paging:paging-compose:1.0.0-alpha19 がリリースされました。バージョン 1.0.0-alpha19 に含まれる commit については、こちらをご覧ください。

すべての遅延レイアウトのサポート

以前の Paging Compose では、LazyListScope でカスタム items および itemsIndexed 拡張機能が提供されていました。そのため、LazyVerticalGridHorizontalPager、または Wear と TV のライブラリで提供される他のカスタム遅延コンポーネントなどの他の遅延レイアウトでは Paging Compose を使用できませんでした。この柔軟性の問題への対処が、このリリースの主要なアップデートです。

遅延レイアウトをさらにサポートするには、別のレイヤで API を作成する必要がありました。遅延レイアウトごとにカスタムの items API を提供するのではなく、Paging Compose で、itemKeyitemContentTypeLazyPagingItems に少し低レベルの拡張メソッドが提供されるようになりました。これらの API は、LazyColumnLazyVerticalGrid にすでに存在する標準の items API や、HorizontalPager などの API の同等の API に、key パラメータと contentType パラメータを実装しやすくすることに重点を置いています。(Ifa13bIb04f0b/259385813

つまり、LazyVerticalGrid をサポートするとは次のようになります。

// This part is unchanged
val lazyPagingItems = pager.collectAsLazyPagingItems()

LazyVerticalGrid(columns = GridCells.Fixed(2)) {
  // Here we use the standard items API
  items(
    count = lazyPagingItems.itemCount,
    // Here we use the new itemKey extension on LazyPagingItems to
    // handle placeholders automatically, ensuring you only need to provide
    // keys for real items
    key = lazyPagingItems.itemKey { it.uniqueId },
    // Similarly, itemContentType lets you set a custom content type for each item
    contentType = lazyPagingItems.itemContentType { "contentType" }
  ) { index ->
    // As the standard items call provides only the index, we get the item
    // directly from our lazyPagingItems
    val item = lazyPagingItems[index]
    PagingItem(item = item)
  }
}

これらの新しい API のその他の使用例については、サンプルをご覧ください。

これらの変更により、LazyColumnLazyRow の例は数行長くなりますが、今後 Paging Compose を使用する人にとっては、すべての遅延レイアウトの整合性が重要な要素であると考えています。そのため、LazyListScope の既存の拡張機能は非推奨になりました。(I0c459I92c8fb/276989796

API の変更

  • 新しい API への移行を容易にするため、LazyListScopeitems 拡張関数と itemsIndexed 拡張関数が contentType パラメータをサポートするようになりました。これにより、新しい API でのサポートがミラーリングされます。(Ib1918b/255283378

依存関係の更新

  • Paging Compose の依存関係が Compose 1.0.5 から Compose 1.2.1 に更新されました。(Ib1918b/255283378

バージョン 1.0.0-alpha18

2023 年 2 月 8 日

androidx.paging:paging-compose:1.0.0-alpha18 がリリースされました。変更はありません。バージョン 1.0.0-alpha18 に含まれる commit については、こちらをご覧ください

バージョン 1.0.0-alpha17

2022 年 10 月 24 日

androidx.paging:paging-compose:1.0.0-alpha17 がリリースされました。バージョン 1.0.0-alpha17 に含まれる commit については、こちらをご覧ください

新機能

  • collectLazyPagingItems の呼び出し時のカスタム CoroutineContext のサポートを追加しました。(I7a574b/243182795b/233783862

バージョン 1.0.0-alpha16

2022 年 8 月 10 日

androidx.paging:paging-compose:1.0.0-alpha16 がリリースされました。バージョン 1.0.0-alpha16 に含まれる commit については、こちらをご覧ください

新機能

  • Paging が LazyPagingItems クラスを介してログを提供するようになり、PagingData から収集されたデバッグ情報が公開されるようになりました。
  • ログは、adb shell コマンド adb shell setprop log.tag.Paging [DEBUG|VERBOSE] を介して有効にできます。([b/235527159}(https://issuetracker.google.com/issues/235527159))

バグの修正

  • paging-common:3.1.1 以前で paging-compose:1.0.0-alpha15 を使用すると発生していた PagingDataDiffer コンストラクタの欠落エラーを修正しました。(b/235256201b/239868768

バージョン 1.0.0-alpha15

2022 年 6 月 1 日

androidx.paging:paging-compose:1.0.0-alpha15 がリリースされました。バージョン 1.0.0-alpha15 に含まれる commit については、こちらをご覧ください

API の変更

  • CoroutineDispatcher の代わりに CoroutineContext を受け入れる PagingDataAdapterAsyncPagingDataDiffer のコンストラクタを追加しました。(Idc878

バグの修正

  • LazyPagingItems により最初の loadState が設定され、LoadState.Loading の更新が行われるようになりました。(I55043b/224855902

バージョン 1.0.0-alpha14

2021 年 10 月 13 日

androidx.paging:paging-compose:1.0.0-alpha14 がリリースされました。バージョン 1.0.0-alpha14 に含まれる commit については、こちらをご覧ください

バージョン 1.0.0-alpha13

2021 年 9 月 29 日

androidx.paging:paging-compose:1.0.0-alpha13 がリリースされました。バージョン 1.0.0-alpha13 に含まれる commit については、こちらをご覧ください。

API の変更

  • LazyPagingItems.snapshot() 関数を LazyPagingItems.itemSnapshotList プロパティに置き換えました。(Ie2da8
  • サポートが終了した LazyPagingItems.getAsState() を削除しました。(Ie65e4

バージョン 1.0.0-alpha12

2021 年 7 月 21 日

androidx.paging:paging-compose:1.0.0-alpha12 がリリースされました。バージョン 1.0.0-alpha12 に含まれる commit については、こちらをご覧ください

API の変更

  • Paging と LazyColumn/Row の接続に使用する items(lazyPagingItems)itemsIndexed(lazyPagingItems) で、アイテムを表す固定キーを指定するためのオプションのキーパラメータを使用できるようになりました。キーの詳細については、こちらをご覧ください。(I7986d
  • lazyPagingItems.getAsState(index) 関数のサポートは終了しています。代わりに lazyPagingItems[index] を使用してください。(I086cbb/187339372

バージョン 1.0.0-alpha11

2021 年 6 月 30 日

androidx.paging:paging-compose:1.0.0-alpha11 がリリースされました。バージョン 1.0.0-alpha11 に含まれる commit については、こちらをご覧ください

バージョン 1.0.0-alpha10

2021 年 6 月 2 日

androidx.paging:paging-compose:1.0.0-alpha10 がリリースされました。バージョン 1.0.0-alpha10 に含まれる commit については、こちらをご覧ください。

バージョン 1.0.0-alpha09

2021 年 5 月 18 日

androidx.paging:paging-compose:1.0.0-alpha09 がリリースされました。バージョン 1.0.0-alpha09 に含まれる commit については、こちらをご覧ください。

バグの修正

  • LazyPagingItems の itemCount とアイテム ゲッターが監視可能になり、LazyVerticalGrid でも使用できるようになりました。(Ie2446b/171872064b/168285687

Compose の互換性

  • androidx.paging:paging-compose:1.0.0-alpha09 は、Compose バージョン 1.0.0-beta07 以降に対してのみ互換性があります。

バージョン 1.0.0-alpha08

2021 年 2 月 24 日

androidx.paging:paging-compose:1.0.0-alpha08 がリリースされました。バージョン 1.0.0-alpha08 に含まれる commit については、こちらをご覧ください。

Compose 1.0.0-beta01 との統合に合わせて更新しました。

バージョン 1.0.0-alpha07

2021 年 2 月 10 日

androidx.paging:paging-compose:1.0.0-alpha07 がリリースされました。バージョン 1.0.0-alpha07 に含まれる commit については、こちらをご覧ください

Compose alpha12 と統合するための更新を行いました。

バージョン 1.0.0-alpha06

2021 年 1 月 28 日

androidx.paging:paging-compose:1.0.0-alpha06 がリリースされました。バージョン 1.0.0-alpha06 に含まれる commit については、こちらをご覧ください。

バグの修正

Compose 1.0.0-alpha11 に依存するよう更新しました。

バージョン 1.0.0-alpha05

2021 年 1 月 13 日

androidx.paging:paging-compose:1.0.0-alpha05 がリリースされました。バージョン 1.0.0-alpha05 に含まれる commit については、こちらをご覧ください

Compose 1.0.0-alpha10 に依存するよう更新しました。

バージョン 1.0.0-alpha04

2020 年 12 月 16 日

androidx.paging:paging-compose:1.0.0-alpha04 がリリースされました。バージョン 1.0.0-alpha04 に含まれる commit については、こちらをご覧ください

バグの修正

  • コンビニエンス プロパティ CombinedLoadStates.refreshCombinedLoadStates.prependCombinedLoadStates.append が更新され、リモート更新が確実に適用されるように、メディエータとソースの両方の読み込み状態が NotLoading になった後で初めて Loading から NotLoading に移行するようになりました。(I65619

バージョン 1.0.0-alpha03

2020 年 12 月 2 日

androidx.paging:paging-compose:1.0.0-alpha03 がリリースされました。バージョン 1.0.0-alpha03 に含まれる commit については、こちらをご覧ください

  • Compose 1.0.0-alpha08 に合わせて更新しました。

バージョン 1.0.0-alpha02

2020 年 11 月 11 日

androidx.paging:paging-compose:1.0.0-alpha02 がリリースされました。バージョン 1.0.0-alpha02 に含まれる commit については、こちらをご覧ください

API の変更

  • .peek().snapshot().retry().refresh() メソッドを LazyPagingItem に追加しました。これは AsyncPagingDataDiffer / PagingDataAdapter で利用できるものと同じ機能を公開します。(Iddfe8b/172041660

バージョン 1.0.0-alpha01

2020 年 10 月 28 日

androidx.paging:paging-compose:1.0.0-alpha01 がリリースされました。バージョン 1.0.0-alpha01 に含まれる commit については、こちらをご覧ください

新機能

paging-compose アーティファクトは、Paging ライブラリJetpack Compose との統合を提供します。簡単な使用例を以下に示します。

  @Composable
  @OptIn(ExperimentalLazyDsl::class)
  fun ItemsDemo(flow: Flow<PagingData<String>>) {
      val lazyPagingItems = flow.collectAsLazyPagingItems()
      LazyColumn {
          items(lazyPagingItems) {
              Text("Item is $it")
          }
      }
  }

バージョン 3.0.1

バージョン 3.0.1

2021 年 7 月 21 日

androidx.paging:paging-*:3.0.1 がリリースされました。バージョン 3.0.1 に含まれる commit については、こちらをご覧ください

バグの修正

  • LivePagedList または RxPagedList によって生成された初期値から PagedList.dataSource にアクセスしたときに誤って IllegalStateException がスローされることがなくなりました。(I96707

バージョン 3.0.0

バージョン 3.0.0

2021 年 5 月 5 日

androidx.paging:paging-*:3.0.0 がリリースされました。バージョン 3.0.0 に含まれる commit については、こちらをご覧ください

3.0.0 の主な機能

新しい Paging 3 API を優先して、Paging 2.xx の既存の API の大半のサポートが終了し、次のように改善されています。

  • Kotlin のコルーチンとフローの最高級のサポート
  • キャンセルのサポート
  • 組み込みの読み込み状態およびエラー信号
  • 再試行および更新の機能
  • 3 つの DataSource サブクラスすべてを統一された PagingSource クラスに統合
  • セパレータを追加する組み込みページを含むカスタムページの変換
  • 状態ヘッダーおよびフッターの読み込み

バージョン 3.0.0-rc01

2021 年 4 月 21 日

androidx.paging:paging-*:3.0.0-rc01 がリリースされました。バージョン 3.0.0-rc01 に含まれる commit については、こちらをご覧ください

バグの修正

  • Paging がときどき no-op differ イベントを RecyclerView に送信する問題を修正しました。これにより、特定のリスナーが早期にトリガーされていました。(Ic507fb/182510751

バージョン 3.0.0-beta03

2021 年 3 月 24 日

androidx.paging:paging-*:3.0.0-beta03 がリリースされました。バージョン 3.0.0-beta03 に含まれる commit については、こちらをご覧ください

バグの修正

  • RecyclerView での予期しないジャンプを防ぐため、リストが再読み込みされる際のプレースホルダの処理方法が改善されました。詳しくは、NullPaddedDiffing.md をご覧ください。(If1490b/170027529b/177338149
  • .build() が呼び出されたときに、各種 PagedList ビルダー(以前の互換性パス)がメインスレッドで誤って DataSource.Factory.create() を同期的に呼び出さないようになりました。(b/182798948

バージョン 3.0.0-beta02

2021 年 3 月 10 日

androidx.paging:paging-*:3.0.0-beta02 がリリースされました。バージョン 3.0.0-beta02 に含まれる commit については、こちらをご覧ください。

API の変更

  • Rx3 拡張機能が @ExperimentalCoroutinesApi のオプトイン要件を正しく反映するようになりました。これまでこの拡張機能は @get メソッドにマークされていました。このメソッドは、Kotlin コンパイラでは次の理由で無視されます: https://youtrack.jetbrains.com/issue/KT-45227(I5733c

バグの修正

  • 試験運用版 API の一般使用に対する制限を適用します。(I6aa29b/174531520
  • リモート更新が呼び出されたときに PagingState が常に null になるバグを修正しました。
  • PagingSource によって返された空のページが、Paging が prefetchDistance を満たすために再度フェッチすることを妨げ、Paging が「停止」する原因となるバグを修正しました。

バージョン 3.0.0-beta01

2021 年 2 月 10 日

androidx.paging:paging-*:3.0.0-beta01 がリリースされました。バージョン 3.0.0-beta01 に含まれる commit については、こちらをご覧ください

API の変更

  • Rx2 と Rx3 のラッパーは、依存する試験運用版のアノテーションを公開するようになりました。paging-rxjava2 または paging-rxjava3 で Rx 互換ラッパーを使用している場合は、使用箇所に @OptIn(ExperimentalCoroutinesApi::class) でアノテーションを付ける必要があります。(Ib1f9d

バグの修正

  • 互換性パスを介して v2 DataSource API を使用すると IndexOutOfBoundsException: Inconsistency detected がスローされることがあるという問題を修正しました。
  • 互換性パスを介して使用する DataSource を初期化する際の isInvalid 呼び出しが、メインスレッドではなく、正しく fetchDispatcher で起動されるようになりました。これにより、Room の PagingSource 実装を使用する場合にメインスレッド上の Db アクセスによって IllegalStateException が発生する問題が解決します。

バージョン 3.0.0-alpha13

2021 年 1 月 27 日

androidx.paging:paging-*:3.0.0-alpha13 がリリースされました。バージョン 3.0.0-alpha13 に含まれる commit については、こちらをご覧ください。

API の変更

  • PagingSource.getRefreshKey は実装のオプションではなくなり、デフォルト実装がない抽象関数になりました。移行中のユーザーは、引き続きデフォルト実装を返す(単に null を返す)こともできますが、getRefreshKey() には、ユーザーの現在のスクロール位置に基づいてキーを返す実際の実装が必要です。これにより、可能であれば PagingState.anchorPosition を介してビューポートを中心に Paging で読み込みを続行できます。(I4339a
  • InvalidatingPagingSourceFactory が最終クラスになりました。(Ia3b0a
  • 追加でオプションの SeparatorType パラメータを使用して、ターミナル セパレータ(ヘッダー / フッター)の動作を設定できます。次の 2 つのオプションがあります。
    • FULLY_COMPLETE - 既存の動作。PagingSource と RemoteMediator の両方が endOfPaginationReached をマークするまで待機してから、ターミナル セパレータを追加します。RemoteMediator を使用しない場合、リモートの loadState は無視されます。これは主に、リモートソース(ネットワークなど)からの取得を含め、セクションが完全に読み込まれたときにのみセクション セパレータを表示する場合に便利です。
    • SOURCE_COMPLETE - RemoteMediator が使用されている場合であっても、単に、PagingSource が endOfPaginationReached をマークするまで待機します。これにより、ヘッダーとフッターが初期読み込みと同期して表示されるため、ユーザーはスクロールしてターミナル セパレータを確認する必要がなくなります。(Ibe993b/174700218

バグの修正

  • PageFetcher が PagingSource から読み込みを開始する前に PagingSource が無効にされると発生する、まれなメモリリークを修正しました。(I9606bb/174625633

バージョン 3.0.0-alpha12

2021 年 1 月 13 日

androidx.paging:paging-*:3.0.0-alpha12 がリリースされました。バージョン 3.0.0-alpha12 に含まれる commit については、こちらをご覧ください。

API の変更

  • InvalidatingPagingSourceFactory は抽象メソッドを持たないため、抽象クラスではなくなりました。(I4a8c4
  • Java ユーザー向けに、Lifecycle または CoroutineScope の代わりに ViewModel を受け入れる .cachedIn() のオーバーロードを追加しました。(I97d81b/175332619
  • 変換演算子の引数に Executor を受け入れることで、Java 呼び出し元が PagingData 変換オペレーションを非同期的に使用できるようにしました。すべての -Sync 変換演算子から -Sync サフィックスが削除されました。Kotlin Coroutine ユーザーは、代わりに停止中のブロックを受け入れる拡張関数を呼び出すことで、あいまいさを排除する必要があります。 PagingData 変換演算子はすべて、静的 PagingDataTransforms クラスの拡張機能に移動されました。Java ユーザーは、静的ヘルパー(PagingDataTransforms.map(pagingData, transform) など)を介してそれらを呼び出す必要があります。Kotlin ユーザーは、構文は同じですが、関数をインポートする必要があります。(If6885b/172895919

バグの修正

  • すでにページ分けの最後に到達していると adapter.refresh() 中に RemoteMediator.load() が呼び出されないバグを修正しました。

バージョン 3.0.0-alpha11

2020 年 12 月 16 日

androidx.paging:paging-*:3.0.0-alpha11 がリリースされました。バージョン 3.0.0-alpha11 に含まれる commit については、こちらをご覧ください

新機能

  • 以下の基本的なユースケースについて、保存済み状態のサポートが追加されました(特にレイヤ化されたソースの場合の完全なサポートは、まだ構築中です)。
    • フローがキャッシュに保存され、アプリが中止されていない場合(たとえば、フローがビューモデルでキャッシュに保存され、アクティビティがプロセスで再作成されているなど)。
    • ページング ソースがカウントされ、プレースホルダが有効化され、レイアウトが交互配置されていない場合。

API の変更

  • PagingSource.getRefreshKey() が安定版 API になりました。(I22f6fb/173530980
  • PagingSource.invalidate がオープン関数ではなくなりました。無効化が発生したときに通知を受け取る必要がある場合は、invalidate をオーバーライドする代わりに registerInvalidatedCallback メソッドを呼び出すことを検討してください。(I628d9b/173029013b/137971356
  • Pager は、オプトイン アノテーションを介して試験運用版の API を試験運用版でないパブリック API にリークせず、通常のコンストラクタと合わせて単一の試験運用版コンストラクタを持つようになりました。(I9dc61b/174531520
  • コンビニエンス プロパティ CombinedLoadStates.refreshCombinedLoadStates.prependCombinedLoadStates.append が更新され、リモート更新が確実に適用されるように、メディエータとソースの両方の読み込み状態が NotLoading になった後で初めて Loading から NotLoading に移行するようになりました。(I65619
  • LoadParams.pageSize が削除されました(サポートはすでに終了しています)。PagingSource では LoadParams.loadSize を使用することをおすすめします。

    PagingConfig.initialLoadSize と等価の初回読み込み呼び出しを除いて、LoadParams.loadSize は常に PagingConfig.pageSize と等価になりました。

    Pager または PagedList を使用せずに Paging2 DataSource をテストする場合、initialLoadSize も設定していると、pageSizePagingConfig.pageSize と一致しないことがあります。このテストが重要な場合は、Pager / PagedList を使用してください。これらは、DataSource 読み込みメソッドに対して正しい PageSize を内部的に設定します。(I98ac7b/149157296

バグの修正

  • PagingConfig.maxSize を設定してセパレータを使用したときの IllegalStateException によるクラッシュを修正しました。(I0ed33b/174787528
  • RemoteMediator が設定されている場合、初回読み込みの後で PREPEND / APPEND の読み込み状態がすぐに NotLoading(endOfPaginationReached = true) に更新されないバグを修正しました。(I8cf5a
  • .snapshot() や .peek() などのプレゼンター側の API が、ListUpdateCallback の更新で以前の(古い)リストを返すバグを修正しました。
  • セパレータ演算子を RemoteMediator と併用したときにヘッダーまたはフッターが追加されないバグを修正しました。
  • RemoteMediator で LoadState を NotLoading に更新すると、Loading 状態のまま止まってしまうバグを修正しました。
  • Paging2.0 互換 API である .asPagingSourceFactory() により、誤った CoroutineDispatcher でバッキング DataSource が初期化されるバグを修正しました。これにより、特に Room の現在の PagingSource 実装(この互換性パスを使用します)を利用している場合に、クラッシュと潜在的な ANR の問題が解決されます。

バージョン 3.0.0-alpha10

2020 年 12 月 2 日

androidx.paging:paging-*:3.0.0-alpha10 がリリースされました。バージョン 3.0.0-alpha10 に含まれる commit については、こちらをご覧ください

API の変更

  • サポートが終了している dataRefreshFlow API と dataRefreshListener API は、loadStateFlow / Listener の更新と重複するため、削除されました。移行する場合、loadStateFlow に相当するコードは次のようになります。

    loadStateFlow.distinctUntilChangedBy { it.refresh }
        .filter { it.refresh is NotLoading }
    

    Ib5570b/173530908

バグの修正

  • RemoteMediator REFRESH の endOfPaginationReached が LoadState の更新に正しく伝播され、リモートの APPENDPREPEND がトリガーされなくなりました。(I94a3fb/155290248
  • 最初のページが空であるかフィルタリング条件が厳しいために空のリストが提示されても、Paging は PREPEND または APPEND の読み込みを開始できるようになりました。(I3e702b/168169730
  • 無効化が急に発生すると、その後の PagingSource の生成で getRefreshKey が呼び出されない問題を修正しました。(I45460b/170027530

外部からの協力

  • .invalidate() API 用に新しい抽象クラス InvalidatingPagingSourceFactory が追加されました。これにより、生成されるすべての PagingSource に invalidate を転送できます。@claraf3 に感謝いたします。(Ie71fcb/160716447

既知の問題

  • RemoteMediator を使用したとき、.insertSeparators() 変換のヘッダーとフッターがすぐに表示されないことがあります。b/172254056
  • RemoteMediator を使用すると、RemoteMediator.load() が結果を返す前に無効化と PagingSource.load(LoadParams.Refresh(...)) が完了した場合、リモートの LoadState が止まってしまうことがあります。b/173717820

バージョン 3.0.0-alpha09

2020 年 11 月 11 日

androidx.paging:paging-*:3.0.0-alpha09 がリリースされました。バージョン 3.0.0-alpha09 に含まれる commit については、こちらをご覧ください。

API の変更

  • replaceWith 句を使用した dataRefreshFlow / Listener メソッドのサポートを完全に終了しました。(I6e2dd

バグの修正

  • RemoteMediator で区切り文字を使用していると IllegalArgumentException がスローされ、endOfPagination を返すリモートロードがまだ動作している間に無効化がトリガーされる問題を修正しました。(I3a260

バージョン 3.0.0-alpha08

2020 年 10 月 28 日

androidx.paging:paging-*:3.0.0-alpha08 がリリースされました。バージョン 3.0.0-alpha08 に含まれる commit については、こちらをご覧ください

API の変更

  • DataSource.InvalidatedCallback の Kotlin と Java のバリアントは、機能インターフェース(Kotlin 1.4 で利用可能)を介して Kotlin で SAM 変換を有効にすることにより統合されました。これにより、.map または .mapByPage による変換後に kotlin バリアントの無効化コールバックが呼び出されないバグも修正されました。(I1f244b/165313046

バグの修正

  • Paging と ViewPager のインタラクションが大幅に改善されました。具体的には、Paging ではページの無効化を理由とした RemoteMediator#load の呼び出しをキャンセルしなくなりました。また、REFRESH が必要な場合、REFRESH リクエストが正常に完了するまで、先頭または最後での読み込みリクエストも行わなくなりました。I6390bb/162252536
  • MissingGetterMatchingBuilder の API lint チェックが androidx で有効になりました(I4bbeab/138602561
  • バックグラウンド スレッドからの RecyclerView の通知が原因で .withLoadState*ConcatAdapter ヘルパーがクラッシュするバグを修正しました(I18bb5b/170988309
  • 極めて小さな非空白ページの読み込みにおいて、プリフェッチで読み込みが正常にトリガーされないことがあるバグを修正しました(Iffda3b/169259468

バージョン 3.0.0-alpha07

2020 年 10 月 1 日

androidx.paging:paging-*:3.0.0-alpha07 がリリースされました。バージョン 3.0.0-alpha07 に含まれる commit については、こちらをご覧ください

API の変更

  • 非同期の Guava ベースの PagingData 演算子で、Executor をパラメータとして受け取り、実行コンテキストを制御できるようになりました。(Id4372

バグの修正

  • 競合状態が原因で RemoteMediator でスローされる IndexOutOfBounds 例外を修正しました。(I00b7fb/165821814
  • DataSource から PagingSource への変換における競合状態により、PagingSource で DataSource の無効化シグナルが無視される可能性がある問題を修正しました。
  • ページ取得ロジックにおいて、PagingDataAdapter.refresh() が呼び出されるまで PagingSource の新しい生成を取得できない可能性がある問題を修正しました
  • PagingSource に変換された DataSource(Room によって生成されたものなど)を RemoteMediator と組み合わせて使用する際にスクロール位置が失われる場合がある問題を修正しました。

外部からの協力

  • PagingData の RxJava2、RxJava3、Guava ベースの非同期変換演算子の追加に協力してくださった @simonschiller に感謝いたします。

バージョン 3.0.0-alpha06

2020 年 9 月 2 日

androidx.paging:paging-*:3.0.0-alpha06 がリリースされました。バージョン 3.0.0-alpha06 に含まれる commit については、こちらをご覧ください

API の変更

  • PagingDataAdapter.setHasStableIds が呼び出されるたびに UnsupportedOperationException がスローされ、固定 ID がサポートされていないことが明確に示されます。(Ib3890b/158801427

バグの修正

  • 空白のページが多数挿入された場合でも insertSeparators が空白のページを除外しなくなり、プレゼンターがプリフェッチの距離に準拠するようになりました。(I9cff6b/162538908

バージョン 3.0.0-alpha05

2020 年 8 月 19 日

androidx.paging:paging-*:3.0.0-alpha05 がリリースされました。バージョン 3.0.0-alpha05 に含まれる commit については、こちらをご覧ください

バグの修正

  • Paging は、提示されるデータがかなりフィルタリングされている場合でも、ページのプリフェッチを正しく行うようになりました。
  • 読み込みの再試行に対して LoadResult.Error を返しても、アイテム アクセスが誤って再試行を再びトリガーすることはなくなりました。

外部からの協力

  • テストのクリーンアップにご協力いただいた Clara F 氏に感謝いたします。(549612

バージョン 3.0.0-alpha04

2020 年 8 月 5 日

androidx.paging:paging-*:3.0.0-alpha04 がリリースされました。バージョン 3.0.0-alpha04 に含まれる commit については、こちらをご覧ください

API の変更

  • peek() API が AsyncPagingDataDifferPagingDataAdapter に追加され、ページの読み込みをトリガーせずに、提示されるデータにアクセスできるようになりました(I38898b/159104197
  • snapshot() API が PagingDataAdapterAsyncPagingDataDiffer に追加され、ページの取得をトリガーせずに、提示されるアイテムを取得できるようになりました(I566b6b/159104197
  • PagingData.from(List<T>) コンストラクタが追加され、静的リストを提示できるようになりました。このリストを PagingData フロー全体と組み合わせて、特定の状態(初期 REFRESH が終了する前や変換テスト用など)で静的リストを表示できます(Id134d
  • dataRefresh フロー / Listener API はサポートが終了されます。これらは、提示されたアイテムの状態を REFRESH 時に公開するためのものですが、loadState フロー / Listener コールバックのタイミングと itemCount プロパティの改善により、不要になりました(Ia19f3
  • PagingSourceRemoteMediator の RxJava3 互換ラッパーが追加されました(I49ef3b/161480176

バグの修正

  • toPagingSourceFactory ヘルパーを介して PagingSource に変換される PositionalDataSource(Room によって生成されるPagingSource を含む)がジャンプをサポートするようにそれ自体を正しくマークするようになりました(I3e84cb/162161201
  • submitData の同期バリアントを使用すると、場合によって競合が発生し、ClosedSendChannelException の原因となるバグを修正しました(I4d702b/160192222

外部からの協力

  • Slack に代わり、RxJava3 互換ラッパーの追加に協力してくださった Zac Sweers 氏に感謝いたします(I49ef3b/161480176

バージョン 3.0.0-alpha03

2020 年 7 月 22 日

androidx.paging:paging-*:3.0.0-alpha03 がリリースされました。バージョン 3.0.0-alpha03 に含まれる commit については、こちらをご覧ください

API の変更

  • PagingState のコンストラクタが一般公開され、getRefreshKey() の実装のテストが簡単になりました(I8bf15
  • 元のバリアントと kotlin バリアントとの曖昧さを解消するため、Java から DataSource kotlin マップが非表示になりました(If7b23b/161150011
  • Kotlin ユーザーの便宜性を目的とする冗長な API が @JvmSynthetic とマークされました(I56ae5
  • itemsBefore と itemsAfter をデフォルトで COUNT_UNDEFINED に設定する LoadResult.Page のコネクタにオーバーロードが追加されました(I47849
  • 既存の PagingData 演算子に停止中メソッドを受け入れされ、Java ユーザー向けの新しい mapSync、flatMapSync、filterSync の非停止演算子を導入しました。既存の変換メソッドは拡張関数に移行されたため、Kotlin ユーザーはインポートする必要があります(I34239b/159983232

バグの修正

  • Room(および PositionalDataSource)の PagingSource に、最初のページの一部として先頭の区切り文字が表示され、ユーザーがスクロールして表示する必要がなくなりました(I6f747b/160257628
  • PagingData.filter() による変換後、リクエストされたインデックスと一致するページが返されるまで、プレースホルダ上のアイテム アクセスが PagingSource 読み込みを正しくトリガーするようになりました(I95625b/158763195
  • PagingSource からエラーが返された後でスクロールすると PagingDataAdapter.retry() が再試行できなくなることがあるバグを修正しました(I1084fb/160194384
  • ページを削除した後のアイテム アクセスではページは読み込まれないのにアイテム アクセスが prefetchDistance 内にあった問題を修正しました(Ie95aeb/160038730
  • PagingConfig.maxSize を設定しても、削除イベント後にプレースホルダが有効にならなくなりました(I2be29b/159667766

バージョン 3.0.0-alpha02

2020 年 6 月 24 日

androidx.paging:paging-*:3.0.0-alpha02 がリリースされました。バージョン 3.0.0-alpha02 に含まれる commit については、こちらをご覧ください

API の変更

  • PagingConfig のコンストラクタに一般的なデフォルト値を持つオーバーロードを追加しました(I39c50b/158576040)。
  • PagingDataAdapterAsyncPagingDataDiffer のコンストラクタに一般的なデフォルト値を持つオーバーロードを追加しました(Ie91f5)。
  • アダプタ API の dataRefreshFlowdataRefreshListener では、PagingData が空かどうかを示すブール値を渡すようになりました(I6e37eb/159054196)。
  • RemoteMediator 用の RxJava API と Guava API である RxRemoteMediatorListenableFutureRemoteMediator を追加しました。
  • isEmpty()firstItemOrNull() などの一般的なアイテムへのアクセス用に PagingState にヘルパーを追加しました(I3b5b6b/158892717)。

バグの修正

  • 無効な PagingSource を誤って再利用しないように(不明確なエラーが発生していました)、Pager はファクトリで PagingSource の再利用をチェックするようになりました(I99809b/158486430)。
  • RemoteMediator REFRESH でエラーが発生して PagingSource の読み込みを妨げることはなくなりました(I38b1bb/158892717)。
  • submitData の非 suspend バージョンは、submitData の suspend バージョンの後に呼び出された場合に複数の PagingData の同時収集が原因でクラッシュを引き起こすことがなくなりました。(I26358b/158048877
  • 設定の変更後に発生する可能性のある「ページャーから 2 回収集できない」例外を修正しました(I58bccb/158784811)。

バージョン 3.0.0-alpha01

2020 年 6 月 10 日

androidx.paging:paging-*:3.0.0-alpha01 がリリースされました。バージョン 3.0.0-alpha01 に含まれる commit については、こちらをご覧ください

Paging ライブラリが 3.0 にアップデートされ、いくつかの重要な新機能が有効になりました。

3.0 の新機能

既知の問題

  • Paging 3 の javadoc はまだ利用できません。当面は、上記のリンク先のガイドまたは Kotlin ドキュメントをご利用ください。(b/158614050

バージョン 2.1.2

バージョン 2.1.2

2020 年 3 月 18 日

androidx.paging:paging:2.1.2 がリリースされました。バージョン 2.1.2 に含まれる 2.1.0 に対する commit については、こちらをご覧ください

バグの修正

  • 無効化中に位置を変換する際にまれに発生する IndexOutOfBoundsException を修正しました。

リリースの問題

  • Paging バージョン 2.1.1 が誤って構成されたブランチから誤ってリリースされていたため、部分的に実装された API と機能が今後のリリースで公開されます。

  • Paging 2.1.2 には、2.1.1 で最初にリリースされた負荷中心の修正が含まれていますが、今回は 2.1.0 リリースの上から正しく選択されています。現在 2.1.1 をお使いの場合は、このリリースにアップグレードすることを強くおすすめします。

バージョン 2.1.1

バージョン 2.1.1

2019 年 12 月 18 日

androidx.paging:paging-*:2.1.1 がリリースされました。バージョン 2.1.1 に含まれる commit については、こちらをご覧ください

バグの修正

  • プレースホルダが無効になっている場合、PositionalDataSources からの連続した初期読み込みが、最後のアクセスを中心に行われるようになりました。

バージョン 2.1.0

バージョン 2.1.0

2019 年 1 月 25 日

Paging 2.1.0 がリリースされました。2.1.0-rc01 からの変更はありません。

バージョン 2.1.0-rc01

2018 年 12 月 6 日

Paging 2.1.0-rc01 がリリースされました。2.1.0-beta01 からの変更はありません。

バージョン 2.1.0-beta01

2018 年 11 月 1 日

Paging 2.1.0-beta01 がリリースされました。2.1.0-alpha01 からの変更はありません。

バージョン 2.1.0-alpha01

2018 年 10 月 12 日

Paging 2.1.0-alpha01 では、2 つの重要な機能(ページ削除機能と、すべてのアーティファクトを対象とした KTX 拡張ライブラリ)が追加されています。また、API の変更とバグの修正も行われています。

API の変更

  • PagedList.Config.Builder.setMaxSize() が追加されました。このメソッドにより、メモリに読み込むアイテムの数を制限できます。
  • androidx.paging.Config()PagedList.Config.Builder に代わる Kotlin のオプションとして追加されました。
  • androidx.paging.PagedList()PagedList.Builder に代わる Kotlin のオプションとして追加されました。
  • DataSourceFactory.toLiveData()LivePagedListBuilder に代わる Kotlin のオプションとして追加されました。
  • DataSourceFactory.toObservable()toFlowable()RxPagedListBuilder に代わる Kotlin のオプションとして追加されました。
  • PagedList が交換されるタイミングをリッスンするための AsyncPagedListDiffer.addPagedListListener() が追加されました。b/111698609
  • 新旧のリストを渡す PagedListAdapter.onCurrentListChanged() のバリアントが追加され、以前のバリアントは非推奨になりました。
  • PagedListAdapter/AsyncPagedListDiffer.submitList() のバリアントが追加されました。このバリアントは、比較した後に PagedList を表示する場合にトリガーされる追加のコールバックを受け取ります。これにより、PagedList の交換を他の UI の更新と同期できるようになりました。b/73781068
  • PagedList.getLoadedCount() が追加され、メモリ内のアイテム数を把握できるようになりました。プレースホルダが無効になっている場合、戻り値は常に .size() と等しくなります。

バグの修正

  • リストを再利用する場合に比較を実行するときの競合状態を修正しました。b/111591017
  • インデックスが無効な場合、PagedList.loadAround()IndexOutOfBoundsException をスローするようになりました。以前は、他の不明確な例外により、クラッシュが発生することがありました。
  • データの変更がなく、初期読み込みサイズが極めて小さい場合に、読み込みがそれ以上行われなくなる問題を修正しました。b/113122599

バージョン 2.0.0

バージョン 2.0.0

2018 年 10 月 1 日

Paging 2.0.0 のリリースでは、バグが 1 件修正されています。

バグの修正

  • PositionalDataSource とプレースホルダを使用して非常に高速にスクロールした場合にクラッシュが発生する可能性がある問題を修正しました。b/114635383

バージョン 2.0.0-beta01

2018 年 7 月 2 日

バグの修正

  • 一部の追加のケース(プレースホルダが無効化されている、PositionalDataSource)でコンテンツが表示されない問題を修正しました。b/80149146
  • 1.0.1 ですでにリリース済み)PagedListAdapterAsyncPagedListDiffer が移動イベントを通知できずにクラッシュする問題を修正しました。b/110711937

AndroidX 以前の依存関係

AndroidX 以前のバージョンの Paging では、次の依存関係を含めます。

dependencies {
    def paging_version = "1.0.0"

    implementation "android.arch.paging:runtime:$paging_version"

    // alternatively - without Android dependencies for testing
    testImplementation "android.arch.paging:common:$paging_version"

    // optional - RxJava support
    implementation "android.arch.paging:rxjava2:$paging_version"
}

バージョン 1.0.1

バージョン 1.0.1

2018 年 6 月 26 日

Paging 1.0.1 のリリースでは、runtime のバグが 1 件修正されています。安定性を得るために、1.0.1 を使用することを強くおすすめします。Paging RxJava2 1.0.1 もリリースされています。これは 1.0.0-rc1 とまったく同じです。

バグの修正

  • PagedListAdapterAsyncPagedListDiffer が移動イベントを通知できずにクラッシュする問題を修正しました。b/110711937

RxJava2 バージョン 1.0.0

RxJava2 バージョン 1.0.0-rc1

2018 年 5 月 16 日

Paging RxJava2 1.0.0-rc1 がリリース候補版に移動されています。最初のアルファ版からの変更はありません。

バージョン 1.0.0

バージョン 1.0.0-rc1

2018 年 4 月 19 日: Paging リリース候補版

既知の問題と、Paging 1.0.0 で導入予定の新機能はこれ以上ありません1.0.0-rc1 を使用するようにプロジェクトをアップグレードし、1.0.0 の信頼性を高めるためのバトルテストにご協力ください。

このリリースでは、変更はありません。1.0.0-beta1 と同じです。

バージョン 1.0.0-beta1

2018 年 4 月 5 日

Paging は、リリース候補版に進む前の少しの間、ベータ版が提供される予定です。 Paging 1.0 でのこれ以上の API の変更は予定していません。API の変更に対する制約が非常に大きくなっています。

Paging に対するアルファ版 RxJava2 のサポートが、独立したオプションのモジュールとしてリリースされました(android.arch.paging:rxjava2:1.0.0-alpha1)。安定するまで、一時的に独立してバージョニングされる予定です。

この新しいライブラリには LivePagedListBuilder に代わる RxJava2 が用意されており、ObservableFlowable を作成し、Executor ではなく Scheduler を取得できます。

Kotlin

val pagedItems = RxPagedListBuilder(myDataSource, /* page size */ 50)
        .setFetchScheduler(myNetworkScheduler)
        .buildObservable()

Java

Observable<PagedList<Item>> pagedItems =
        RxPagedListBuilder(myDataSource, /* page size */ 50)
                .setFetchScheduler(myNetworkScheduler)
                .buildObservable();

新機能

  • 新しい android.arch.paging:rxjava2 アーティファクトを介して RxPagedListBuilder が追加されました。

API の変更

  • ビルダーのエグゼキュータの役割を明確にするために、API が次のように変更されました。

    • setBackgroundThreadExecutor() の名前が setFetchExecutor() に変更されました(PagedList.BuilderLivePagedListBuilder

    • setMainThreadExecutor() の名前が setNotifyExecutor() に変更されました(PagedList.Builder

  • PagedList.mCallbacks メンバーを非公開に修正しました。

バグの修正

  • LivePagedListBuilder は、Arch コンポーネントの IO スレッドプールではなく、指定されたエグゼキュータで、最初の PagedList の読み込みをトリガーするようになりました。

  • 内部の DataSource ラッパー(DataSource.map の実装と、プレースホルダが無効化された PositionalDataSource の読み込みの実装に使用される)での無効な動作を修正しました。b/77237534

バージョン 1.0.0-alpha7

2018 年 3 月 21 日

Paging 1.0.0-alpha7 が Lifecycles 1.1.1 とともにリリースされました。上記のとおり、Paging alpha7 は Function クラスの移動に依存するため、lifecycle:runtime の依存関係を android.arch.lifecycle:runtime:1.1.1 に更新する必要があります。

Paging alpha7 は、Paging がベータ版になる前の最終リリースになる予定です。

API の変更

  • DataSource.LoadParams オブジェクトにパブリック コンストラクタが追加され、DataSource.LoadCallback は抽象オブジェクトになりました。これにより、DataSource をラップする、またはモック コールバックを使用して DataSource を直接テストすることができます。 b/72600421
  • DataSource と DataSource.Factory のマッパー
    • map(Function<IN,OUT>) を使用すると、DataSource で読み込んだ結果を変換、ラップ、装飾することができます。
    • mapByPage(<List<IN>,List<OUT>>) をバッチ処理で実行しても同じ結果が得られるようになりました(たとえば、SQL で読み込んだアイテムで、別のデータベースに対するクエリをさらに実行する必要がある場合、バッチとして実行できます)。
  • PagedList#getDataSource() がコンビニエンス メソッドとして追加されました。b/72611341
  • サポートが終了したすべてのクラスが API から削除されました(recyclerview.extensions パッケージの残り、LivePagedListProvider など)。
  • DataSource.Factory がインターフェースから抽象クラスに変更され、マップ機能を使用できるようになりました。

バグの修正

  • ビルダーを最終版に変更しました。b/70848565
  • Room DataSource の実装が、マルチテーブル クエリを処理するように修正されました。この修正は Room 1.1.0-beta1 に反映されています(上記を参照)。
  • プレースホルダが有効で、合計サイズがページサイズのちょうど倍数である場合に、PositionalDataSourceBoundaryCallback.onItemAtEndLoaded が呼び出されないバグを修正しました。

バージョン 1.0.0-alpha5

2018 年 1 月 22 日

バグの修正

  • プレースホルダが無効になっているときのページ読み込みを修正しました。b/70573345
  • IllegalArgumentException のバグを見つけるためのログが追加されました。b/70360195(および Room 側の理論的な修正)
  • Javadoc のサンプルコードを修正しました。b/70411933b/71467637