分页

分页库使您能够更轻松地在应用的 RecyclerView 中逐步且流畅地加载数据。

此表列出了 androidx.paging 组中的所有构件。

构件 稳定版 候选版 Beta 版 Alpha 版
paging-* 3.3.4 - - -
paging-compose 3.3.4 - - -
此库上次更新于:2024 年 11 月 13 日

声明依赖项

要添加对 Paging 的依赖项,您必须将 Google Maven 存储库添加到您的项目中。阅读 Google 的 Maven 存储库 以了解更多信息。

在应用或模块的 build.gradle 文件中添加所需构件的依赖项

Groovy

dependencies {
  def paging_version = "3.3.4"

  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.4"
}

Kotlin

dependencies {
  val paging_version = "3.3.4"

  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.4")
}

有关使用 Kotlin 扩展的信息,请参阅 ktx 文档

有关依赖项的更多信息,请参阅 添加构建依赖项

反馈

您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请查看此库中 现有问题。您可以通过单击星号按钮为现有问题添加您的投票。

创建新问题

有关更多信息,请参阅 问题跟踪器文档

3.3 版

3.3.4 版

2024 年 11 月 13 日

已发布 androidx.paging:paging-*:3.3.4 版本。3.3.4 版本包含这些提交

错误修复

  • 导入 Paging 3.3 或更高版本的 Android 单元测试将不再抛出诸如 Method isLoggable in android.util.Log not mocked 之类的错误。(Ia9400b/331684448

3.3.2 版本

2024 年 8 月 7 日

已发布 androidx.paging:paging-*:3.3.2 版本。3.3.2 版本包含这些提交

新功能

  • paging-commonpaging-testing 添加了新的 Kotlin 多平台目标:watchostvoslinuxArm6490c9768),(53e0eca

3.3.1 版本

2024 年 7 月 24 日

已发布 androidx.paging:paging-*:3.3.1 版本。3.3.1 版本包含这些提交

错误修复

  • 修复了当后台数据源在滚动时刷新时,AsyncPagingDataDiffer 或在其之上构建的 API(例如与 RecyclerView 一起使用的 PagingDataAdapter)无法触发更多加载的问题。(I60ca5b/352586078
  • 修复了在使用 PagingDataAdapterAsyncPagingDataDiffer 滚动 RecyclerView 时,从后台数据源中删除项目时发生的崩溃。(I8c65ab/347649763

3.3.0 版本

2024 年 5 月 14 日

已发布 androidx.paging:paging-*:3.3.0 版本。3.3.0 版本包含这些提交

自 3.2.0 版本以来的重要更改

  • PagingDataPresenter 现在是公共类。现在可以在 PagingDataPresenter 之上构建多平台演示器,而无需内部 Paging API 或 paging-runtimeAsyncPagingDataDiffer
  • LoadStatesCombinedLoadStates 中添加了新的辅助方法 hasErrorisIdle,分别用于检查 LoadStates 是否处于错误或 NotLoading 状态。还在 Flow<CombinedLoadStates> 上添加了一个新的 awaitNotLoading() Kotlin 扩展方法,该方法等待直到加载已稳定到 NotLoading 或错误状态。
  • PagingData.empty() 现在默认情况下会分派 NotLoading 状态,除非其构造函数传递自定义 LoadStates。这与现有行为不同,现有行为是在提交到 PagingDataAdapter 时不分派 LoadStates,或者在作为 LazyPagingItems 收集时分派 Loading 状态。当作为 LazyPagingItems 收集时,它现在还将在初始组合后立即显示空列表。

Kotlin 多平台兼容性

Paging 现在附带与 Kotlin 多平台兼容的工件,这很大程度上要归功于 CashApp 的 multiplatform-paging 项目的上游工作。

  • paging-common 已将所有 Paging 3 API 移动到 common,现在除了 Android 之外还与 jvm 和 iOS 兼容。
  • paging-testing 已将其代码移动到 common,现在除了 Android 之外还与 jvm 和 iOS 兼容。
  • paging-compose 已将其代码移动到 common 并提供了一个 Android 工件,与 androidx.compose 的多平台支持相匹配。
  • paging-runtimepaging-guavapaging-rxjava2paging-rxjava3 将仍然仅限于 Android。

3.3.0-rc01 版本

2024 年 5 月 1 日

已发布 androidx.paging:paging-*:3.3.0-rc01 版本,Paging 3.3.0-beta01 中没有更改。3.3.0-rc01 版本包含这些提交

3.3.0-beta01 版本

2024 年 4 月 3 日

已发布 androidx.paging:paging-*:3.3.0-beta01 版本,没有明显的更改。3.3.0-beta01 版本包含这些提交

3.3.0-alpha05 版本

2024 年 3 月 20 日

已发布 androidx.paging:paging-*:3.3.0-alpha05 版本。3.3.0-alpha05 版本包含这些提交

API 变更

  • Paging 现在使用 AndroidX 注解 @MainThread 注解来进行通用代码。(I78f0db/327682438

3.3.0-alpha04 版本

2024 年 3 月 6 日

已发布 androidx.paging:paging-*:3.3.0-alpha04 版本。3.3.0-alpha04 版本包含这些提交

错误修复

  • 修复了与添加 Kotlin 多平台兼容性相关的次要文档错误。(aosp/2950785

3.3.0-alpha03 版本

2024 年 2 月 7 日

已发布 androidx.paging:paging-*:3.3.0-alpha03 版本。3.3.0-alpha03 版本包含这些提交。

新功能

  • PagingDataPresenter 现在是公共类。现在可以在 PagingDataPresenter 之上构建多平台演示器,而无需内部 Paging API 或 paging-runtimeAsyncPagingDataDiffer。(Id1f74b/315214786
  • 添加了新的 LoadStatesCombinedLoadStates 辅助方法,用于检查 LoadStates 是否处于错误或 NotLoading 状态。还添加了一个新的 API,它等待 LoadStateFlow 直到加载已稳定到 NotLoading 或错误状态。(Id6c67

行为变更

  • PagingData.empty() 现在默认情况下会分派 NotLoading 状态,除非其构造函数传递自定义 LoadStates。这与现有行为不同,现有行为是在提交到 PagingDataAdapter 时不分派 LoadStates,或者在作为 LazyPagingItems 收集时分派 Loading 状态。当作为 LazyPagingItems 收集时,它现在还将在初始组合后立即显示空列表。(I4d11db/301833847

3.3.0-alpha02 版本

2023 年 9 月 20 日

已发布 androidx.paging:paging-*:3.3.0-alpha02 版本。3.3.0-alpha02 版本包含这些提交。

Kotlin 多平台兼容性

Paging 现在附带与 Kotlin 多平台兼容的工件,这很大程度上要归功于 CashApp 的 multiplatform-paging 项目的上游工作。这将使我们能够避免两个存储库之间的差异并保持它们的兼容性。

  • paging-common 已将所有 Paging 3 API 移动到 common,现在除了 Android 之外还与 jvm 和 iOS 兼容。
  • paging-testing 已将其代码移动到 common,现在除了 Android 之外还与 jvm 和 iOS 兼容。
  • paging-compose 已将其代码移动到 common 并提供了一个 Android 工件,与 androidx.compose 的多平台支持相匹配。
  • paging-runtimepaging-guavapaging-rxjava2paging-rxjava3 将仍然仅限于 Android。

API 变更

外部贡献

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 版本包含这些提交。

错误修复

  • 修复了 Paging 测试工件的 asSnapshot() API 在传递使用 PagingData.from(List) 构建的 Flow 时会挂起的问题,因为 asSnapshot() 将没有任何关于加载何时完成的信息(与 PagingData.from(List, LoadStates) 重载不同)。此解决方法仅适用于可完成的 Flow(例如,flowOf(PagingData.from(...)))。对于不可完成的 Flow(例如,MutableStateFlow),请使用提供 LoadStatesPagingData.from 重载。(I502c3
  • Paging Compose 现在内部使用 AndroidUiDispatcher.Main 来确保新数据在加载完成的同一帧中可用。(Ia55af

3.2.0 版本

2023 年 7 月 26 日

已发布 androidx.paging:paging-*:3.2.0 版本。3.2.0 版本包含这些提交。

自 3.1.0 版本以来的重要更改

  • Paging Compose 达到了 API 稳定性,并已合并回 Paging 的其余部分,其版本现在与所有其他 Paging 工件匹配。自 3.1.0 版本以来的更改包括:
    • 通过创建 PagingData.from(fakeData) 并将该 PagingData 包装在 MutableStateFlow 中(例如 MutableStateFlow(PagingData.from(listOf(1, 2, 3))))来支持预览假数据的列表。将此流作为 collectAsLazyPagingItems() 的接收器传递到 @Preview 可组合项以进行预览。
    • 支持所有惰性布局,例如LazyVerticalGridHorizontalPager,以及来自 Wear 和 TV 库的自定义惰性组件。这是通过新的低级别LazyPagingItems扩展方法itemKeyitemContentType实现的,它可以帮助您为LazyColumnLazyVerticalGrid以及HorizontalPager等API中已存在的标准items API实现keycontentType参数。
    • 仅支持LazyListScopeitems(lazyPagingItems)itemsIndexed(lazyPagingItems)已弃用。
  • 新的paging-testing构件,它提供了围绕单元测试应用程序的每一层及其与分页的隔离集成而设计的API。例如,它包括
    • TestPager类,允许您独立于 Pager 和真实 UI 验证您自己的自定义PagingSource实现的行为。
    • asPagingSourceFactory API 可将Flow<List<Value>>或静态List<Value>转换为可传递给测试中 Pager 的PagingSourceFactory
    • Flow<PagingData<Value>>上的asSnapshot Kotlin 扩展函数,它将Flow<PagingData<Value>>转换为直接的List<Value>asSnapshot lambda允许您通过scrollToappendScrollWhile等API模拟应用程序的UI,以便您可以验证分页数据集中任何点的快照数据是否正确。
  • 添加了默认日志,以便在两个级别(VERBOSEDEBUG)公开分页调试信息。可以通过命令adb shell setprop log.tag.Paging [DEBUG|VERBOSE]启用日志。这适用于使用视图的分页和使用 Compose 的分页。
  • 添加了PagingDataAdapterAsyncPagingDataDiffer的构造函数,它们接受CoroutineContext而不是CoroutineDispatcher
  • 添加了一个新的PagingSourceFactory函数接口,它比之前的 () -> PagingSource lambda 提供更明确的 API 表面。此工厂可用于实例化 Pager。

版本 3.2.0-rc01

2023年6月21日

androidx.paging:paging-*:3.2.0-rc01已发布。版本 3.2.0-rc01 包含这些提交。

外部贡献

  • 感谢Veyndan为将 Paging 从 Android/JVM 特定功能中分离出来做出的贡献。(#553#554#555#559

版本 3.2.0-beta01

2023年6月7日

androidx.paging:paging-*:3.2.0-beta01已发布。版本 3.2.0-beta01 包含这些提交。

Paging 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 包含这些提交。

新功能

  • 添加了一个新的PagingSourceFactory函数接口,它比现有的() -> PagingSource lambda 提供更明确的 API 表面。此工厂可用于实例化Pager。(I33165b/280655188
  • 添加了新的paging-testing API 的List<Value>.asPagingSourceFactory(),以获取仅从不可变数据列表加载的PagingSourceFactory。对于使用多代静态数据进行测试,仍应使用现有的Flow<List<Value>>扩展函数。(Id34d1b/280655188

API 变更

  • 现在,paging-testing 中的所有公共 API 都使用@VisibleForTesting进行注释,以确保这些 API 仅在测试中使用。(I7db6e
  • asSnapshot API 不再需要传入CoroutineScope。它现在默认为使用从其父作用域继承的上下文。(Id0a78b/282240990
  • 重新排序了TestPager构造函数参数,以直观地匹配真实Pager构造函数参数顺序(I6185a
  • paging-testing中 lambda 类型() -> 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 包含这些提交。

API 变更

  • asSnapshot 的 Paging 测试 API 现在将其loadOperations参数默认为空 lambda。这允许在不传入任何加载操作的情况下调用asSnapshot以从初始刷新加载中检索数据。(Ied354b/277233770

文档改进

  • 更新了关于asPagingSourceFactory()的文档,以阐明它是Flow上的扩展方法,它返回一个用于生成PagingSource实例的可重用工厂。(I5ff4fI705b5
  • 更新了LoadResult.Page构造函数的文档,以阐明需要重写itemsBeforeitemsAfter以支持跳转。(Ied354

外部贡献

版本 3.2.0-alpha04

2023年2月8日

androidx.paging:paging-*:3.2.0-alpha04已发布。版本 3.2.0-alpha04 包含这些提交。

分页测试

  • paging-testing构件现在包含一个asPagingSourceFactory方法,用于从Flow<List<Value>>创建pagingSourceFactory,以提供给 Pager。从 Flow 发出的每个List<Value>>都表示一代分页数据。这有助于对例如PagingData转换进行分页测试,方法是为 Pager 模拟一个数据源来收集数据。(I6f230b/235528239
  • paging-testing构件已扩展为包含新的API,适用于验证Flow<PagingData<T>>中包含的数据是否正确。例如,这可用于断言ViewModel层中Flow<PagingData<T>>的输出。

    这是通过Flow<PagingData<Value>>上的asSnapshot Kotlin 扩展函数完成的,该函数将Flow<PagingData<Value>>转换为直接的List<Value>asSnapshot lambda 允许您通过诸如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 是一个 suspend 方法,预期在 runTest 中运行。更多信息请参见 在 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-alpha033.2.0-alpha03 版本包含这些提交。

分页测试

此版本包含一个新的构件:paging-testing。此构件提供围绕单元测试应用程序的每一层及其与 Paging 的隔离集成而设计的 API。

例如,此第一个版本包含一个 TestPager 类,允许您独立于通常需要模拟端到端 Paging 集成的 Pager 和真实 UI 验证您自己的自定义 PagingSource 实现的行为。

TestPager 应被视为一个 **模拟对象** - 一个 测试替身,它镜像 Pager 的真实实现,同时为测试 PagingSource 提供简化的 API 表面。这些 API 是 suspend API,应在 在 Android 上测试 Kotlin 协程 指南中概述的 runTest 中运行。

可以在 room-paging 测试 中找到这些 API 的使用示例,这些测试已重构为使用 TestPager

API 变更

  • 通过 LoadResult.Page.iterator() 启用对 LoadResult.Page.data 的便捷迭代。这间接允许在给定 List<LoadResult.Page>(例如 PagingSource.getRefreshKey 方法传递的 PagingStatepages 属性)时使用 Kotlin 标准库 flatten 方法。(Ie0718)

3.2.0-alpha02 版本

2022 年 8 月 10 日

已发布 androidx.paging:paging-*:3.2.0-alpha023.2.0-alpha02 版本包含这些提交。

新功能

  • Paging 现在通过 AsyncPagingDataDifferPagingDataAdapter 类提供日志,以公开从 PagingData 收集的调试信息。
  • 可以通过 adb shell 命令 adb shell setprop log.tag.Paging [DEBUG|VERBOSE] 启用日志。(b/235527159)

错误修复

  • 修复了在将 paging-common:3.2.0-alpha01 与运行时 paging-runtime:3.1.1 或更旧版本一起使用时缺少的 PagingDataDiffer 构造函数错误。(b/235256201)

3.2.0-alpha01 版本

2022 年 6 月 1 日

已发布 androidx.paging:paging-*:3.2.0-alpha013.2.0-alpha01 版本包含这些提交。

API 变更

  • 添加了 PagingDataAdapterAsyncPagingDataDiffer 的构造函数,它们接受 CoroutineContext 而不是 CoroutineDispatcher。(Idc878)
  • 默认情况下,PagingData.from()PagingData.empty() 将不再影响演示者端的 CombinedLoadStates。已添加一个允许将 sourceLoadStatesremoteLoadStates 传递给这些构造函数的新重载,以保持设置 LoadStates 为完全终端(即 NotLoading(endOfPaginationReached = false))的现有行为,并可以选择在需要时包含远程状态。如果未传递 LoadStates,则当演示者接收到静态 PagingData 时,将保持演示者端的先前 CombinedLoadStates。(Ic3ce5b/205344028)

错误修复

  • PagingSource.getRefreshKey() 的结果现在在返回 null 但设置了非 null initialKey 的情况下被正确优先于 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.13.1.1 版本包含这些提交。

错误修复

  • 移除了由 .cachedIn() 错误插入的各代之间出现的中间 LoadState.NotLoading 事件。此更改通过移除在重试失败的加载、刷新或失效期间产生的冗余 LoadState.NotLoading 事件,使对 LoadState 更改做出反应变得容易得多。

3.1.0 版本

2021 年 11 月 17 日

已发布 androidx.paging:paging-*:3.1.03.1.0 版本包含这些提交。

自 3.0.0 版本以来的重要更改

  • Flow<PagingData>.observableFlow<PagingData>.flowable API 不再是实验性的
  • LoadState 的行为更改
    • 对于 PagingSourceRemoteMediatorendOfPaginationReached 现在对于 LoadType.REFRESH 始终为 false
    • 来自 Paging 的 LoadStates 现在会在发出下游数据之前等待 PagingSourceRemoteMediator 的有效值。新一代 PagingData 现在将始终正确地以刷新状态下的 Loading 开始,而不是在某些情况下错误地重置为 NotLoading
    • 演示者 API 上的 .loadStateFlow.addLoadStateListener 不再冗余地发送始终将中介程序状态设置为 null 的初始 CombinedLoadStates
  • 对过去几代的取消现在会在失效/新一代时急切地发生。不再需要在 Flow<PagingData> 上使用 .collectLatest,尽管仍然建议这样做。
  • 已添加 PagingSource.LoadResult.Invalid 作为 PagingSource.load 的新返回类型,这会导致 Paging 丢弃对该 PagingSource 的任何挂起或将来的加载请求并将其失效。此返回类型旨在处理可能从数据库或网络返回的无效或陈旧数据。
  • 添加了 .onPagesPresented.addOnPagesUpdatedListener 演示者 API,这些 API 在页面在 UI 中显示时同步触发。页面更新可能发生在以下情况下
    • 新一代 PagingData 的初始加载完成,无论新一代是否对显示的项目进行了任何更改。即,如果列表完全相同,则新一代完成初始加载且没有更新仍会触发此回调。
    • 插入页面,即使插入的页面不包含新项目。
    • 删除页面,即使删除的页面为空。

3.1.0-rc01 版本

2021 年 11 月 3 日

已发布 androidx.paging:paging-*:3.1.0-rc013.1.0-rc01 版本包含这些提交。

错误修复

  • 修复了 .cachedIn() 中的竞争条件 + 内存泄漏,在 Paging 下游发送多个加载事件但没有观察者或观察者切换到新的 PagingData 时。(Ib682e)

3.1.0-beta01 版本

2021 年 10 月 13 日

已发布 androidx.paging:paging-*:3.1.0-beta013.1.0-beta01 版本包含这些提交。

错误修复

  • 修复了一个问题,即许多快速的项目访问可能会导致它们被丢弃以供 prefetchDistance 考虑,从而导致页面加载停滞。当许多项目一次以优先加载与用户滚动方向相反的顺序布局时,尤其会出现此问题。现在缓冲这些项目访问并同步优先处理,以防止它们被丢弃。(aosp/1833273)

3.1.0-alpha04 版本

2021 年 9 月 29 日

已发布 androidx.paging:paging-*:3.1.0-alpha043.1.0-alpha04 版本包含这些提交。

API 变更

  • Flow<PagingData>.observableFlow<PagingData>.flowable API 不再是实验性的。(Ie0bdd)

错误修复

  • 对于 LoadStates,endOfPaginationReached 现在对于 LoadType.REFRESH 始终为 false。之前,对于 RemoteMediator REFRESHendOfPaginationReached 可能为 true,但对于 PagingSource 则不会。此行为现在已统一为始终返回 false,因为它对 REFRESH 来说永远没有终止的意义,并且现在已作为 LoadStates 中 API 契约的一部分进行记录。在决定分页是否终止时,应始终相对于 APPEND 或 PREPEND 方向进行。(I047b6)
  • 来自 Paging 的 LoadStates 现在会在发出下游数据流之间等待来自 PagingSource 和 RemoteMediator 的有效值。这可以防止新一代 PagingData 在 CombinedLoadStates.source.refresh 中发送 NotLoading(如果它已经处于 Loading 状态);新一代 PagingData 现在将始终以 Loading 状态正确开始刷新状态,而不是在某些情况下首先错误地重置为 NotLoading。

    对过去几代的取消现在会在失效/新一代时积极进行。不再需要在 Flow<PagingData> 上使用 .collectLatest,尽管仍然强烈建议这样做。(I0b2b5b/177351336b/195028524)

  • .loadStateFlow.addLoadStateListener 在 presenter API 上不再冗余地发送一个初始 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 版本包含这些提交。

API 变更

  • 向 PagingSource 添加了第三种 LoadResult 返回类型 LoadResult.Invalid。当 PagingSource.load 返回 LoadResult.Invalid 时,分页将丢弃已加载的数据并使 PagingSource 无效。此返回类型旨在处理可能无效或过时的数据,这些数据可能来自数据库或网络。

    例如,如果底层数据库被写入,但 PagingSource 未及时失效,如果其实现依赖于它从中加载的备份数据集的不可变性(例如,LIMIT OFFSET 样式的数据库实现),它可能会返回不一致的结果。在这种情况下,建议在加载后检查失效,并返回 LoadResult.Invalid,这会导致 Paging 丢弃对该 PagingSource 的任何挂起的或将来的加载请求并使其无效。

    Paging2 API 也支持此返回类型,该 API 利用 LivePagedList 或 RxPagedList。当使用 PagingSource 与 Paging2 的 PagedList API 时,PagedList 会立即分离,停止进一步尝试在此 PagedList 上加载数据,并触发 PagingSource 上的失效。

    LoadResult 是一个密封类,这意味着这是一个源不兼容的更改,因此直接使用 PagingSource.load 结果的用例必须在编译时处理 LoadResult.Invalid。例如,利用穷举 when 检查返回类型的 Kotlin 用户必须添加对 Invalid 类型的检查。(Id6bd3b/191806126b/192013267)

错误修复

  • 通过 PagingSource.registerInvalidatedCallback 或 DataSource.addInvalidatedCallback 添加的失效回调现在如果在已无效的 PagingSource/DataSource 上注册,则会自动触发。这解决了这样一个竞争条件:当提供在初始加载期间已无效的 Source 时,会导致 Paging 丢失失效信号并卡住。此外,失效回调现在在触发后被正确移除,因为保证它们最多只会被调用一次。(I27e69)
  • 提交来自新实例化的 PagedList 数据流的占位符初始值 (InitialPagedList)(例如,LivePagedListBuilder 或 RxPagedListBuilder)将不再清除先前加载的数据。

3.1.0-alpha02 版本

2021 年 7 月 1 日

androidx.paging:paging-*:3.1.0-alpha02 已发布。3.1.0-alpha02 版本包含这些提交。

新功能

  • 添加了 onPagesPresented 监听器和流 presenter API,这些 API 在 UI 中呈现的页面更新后立即触发。

    由于这些更新与 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 版本包含这些提交。

API 变更

  • paging-rxjava3 提供的类现在位于 androidx.paging.rxjava3 包下,这样它们就不会与 paging-rxjava2 冲突。(Ifa7f6)

错误修复

  • 修复了 Paging 有时会向 RecyclerView 发送空操作差异事件的问题,这可能会导致某些监听器过早触发。(Ic507fb/182510751)

外部贡献

  • 向 rxjava3 工件添加了弃用的 PagedList 兼容性 API。(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 版本包含这些提交。

新功能

  • Paging Compose 现在支持通过创建 PagingData.from(fakeData) 并将该 PagingData 包装在 MutableStateFlow 中(例如,MutableStateFlow(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 版本包含这些提交。

支持所有惰性布局

以前,Paging Compose 在 LazyListScope 上提供自定义的 itemsitemsIndexed 扩展方法,这意味着您无法将 Paging Compose 与其他惰性布局一起使用,例如 LazyVerticalGridHorizontalPager 或 Wear 和 TV 库提供的其他自定义惰性组件。解决这种缺乏灵活性是此版本的 主要更新。

为了支持更多惰性布局,我们需要在不同的层构建 API——而不是为每个惰性布局提供自定义的 items API,Paging Compose 现在在 LazyPagingItems 中提供稍微更低级别的扩展方法 itemKeyitemContentType。这些 API 侧重于帮助您实现标准 items API 的 keycontentType 参数,这些 API 已经存在于 LazyColumnLazyVerticalGrid 以及 HorizontalPager 等 API 中的等效项。(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的迁移,LazyListScope上的itemsitemsIndexed扩展函数现在支持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 版本包含这些提交。

1.0.0-alpha17 版本

2022 年 10 月 24 日

androidx.paging:paging-compose:1.0.0-alpha17 版本已发布。1.0.0-alpha17 版本包含这些提交。

新功能

1.0.0-alpha16 版本

2022 年 8 月 10 日

androidx.paging:paging-compose:1.0.0-alpha16 版本已发布。1.0.0-alpha16 版本包含这些提交。

新功能

  • Paging现在通过LazyPagingItems类提供日志,以公开从PagingData收集的调试信息。
  • 可以通过adb shell命令adb shell setprop log.tag.Paging [DEBUG|VERBOSE]启用日志。(b/235527159

错误修复

  • 修复了在将paging-compose:1.0.0-alpha15paging-common:3.1.1或更低版本一起使用时,缺少PagingDataDiffer构造函数错误的问题。(b/235256201b/239868768)

1.0.0-alpha15 版本

2022 年 6 月 1 日

androidx.paging:paging-compose:1.0.0-alpha15 版本已发布。1.0.0-alpha15 版本包含这些提交。

API 变更

  • 添加了 PagingDataAdapterAsyncPagingDataDiffer 的构造函数,它们接受 CoroutineContext 而不是 CoroutineDispatcher。(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 版本包含这些提交。

1.0.0-alpha13 版本

2021 年 9 月 29 日

androidx.paging:paging-compose:1.0.0-alpha13 版本已发布。1.0.0-alpha13 版本包含这些提交。

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 版本包含这些提交。

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 版本包含这些提交。

1.0.0-alpha10 版本

2021 年 6 月 2 日

androidx.paging:paging-compose:1.0.0-alpha10 版本已发布。1.0.0-alpha10 版本包含这些提交。

1.0.0-alpha09 版本

2021年5月18日

androidx.paging:paging-compose:1.0.0-alpha09 版本已发布。1.0.0-alpha09 版本包含这些提交。

错误修复

  • LazyPagingItems 的itemCount和item getter现在是可观察的,这使得它也可以与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 版本包含这些提交。

更新为与Compose 1.0.0-beta01集成。

1.0.0-alpha07 版本

2021年2月10日

androidx.paging:paging-compose:1.0.0-alpha07 版本已发布。1.0.0-alpha07 版本包含这些提交。

更新为与Compose alpha12集成。

1.0.0-alpha06 版本

2021年1月28日

androidx.paging:paging-compose:1.0.0-alpha06 版本已发布。1.0.0-alpha06 版本包含这些提交。

错误修复

更新为依赖Compose 1.0.0-alpha11。

1.0.0-alpha05 版本

2021年1月13日

androidx.paging:paging-compose:1.0.0-alpha05 版本已发布。1.0.0-alpha05 版本包含这些提交。

更新为依赖Compose 1.0.0-alpha10。

1.0.0-alpha04 版本

2020年12月16日

androidx.paging:paging-compose:1.0.0-alpha04 版本已发布。1.0.0-alpha04 版本包含这些提交。

错误修复

  • 更新了便利属性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 版本包含这些提交。

  • 更新为匹配Compose 1.0.0-alpha08。

1.0.0-alpha02 版本

2020年11月11日

androidx.paging:paging-compose:1.0.0-alpha02 版本已发布。1.0.0-alpha02 版本包含这些提交。

API 变更

  • LazyPagingItems添加了.peek().snapshot().retry().refresh()方法,这些方法公开了AsyncPagingDataDiffer/PagingDataAdapter中提供的相同功能。(Iddfe8b/172041660)

1.0.0-alpha01 版本

2020年10月28日

androidx.paging:paging-compose:1.0.0-alpha01 版本已发布。1.0.0-alpha01 版本包含这些提交。

新功能

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 版本包含这些提交。

错误修复

  • 访问LivePagedListRxPagedList生成的初始值中的PagedList.dataSource将不再错误地抛出IllegalStateException异常。(I96707)

3.0.0 版本

3.0.0 版本

2021年5月5日

androidx.paging:paging-*:3.0.0 版本已发布。3.0.0 版本包含这些提交。

3.0.0 版本的主要功能

为了带来以下改进,Paging 2.x.x 中的大多数现有 API 已经被弃用,取而代之的是新的 Paging 3 API

  • 一流的 Kotlin 协程和 Flow 支持
  • 支持取消
  • 内置加载状态和错误信号
  • 重试+刷新功能
  • 所有三个 DataSource 子类都已合并到一个统一的 PagingSource 类中
  • 自定义页面转换,包括一个用于添加分隔符的内置转换
  • 加载状态标题和页脚

3.0.0-rc01 版本

2021年4月21日

androidx.paging:paging-*:3.0.0-rc01 版本已发布。3.0.0-rc01 版本包含这些提交。

错误修复

  • 修复了 Paging 有时会向 RecyclerView 发送空操作差异事件的问题,这可能会导致某些监听器过早触发。(Ic507fb/182510751)

3.0.0-beta03 版本

2021年3月24日

androidx.paging:paging-*:3.0.0-beta03 版本已发布。3.0.0-beta03 版本包含这些提交。

错误修复

  • 我们已经彻底修改了列表重新加载时占位符的处理方式,以防止RecyclerView中出现意外跳转。有关详细信息,请参阅NullPaddedDiffing.md。(If1490b/170027529b/177338149)
  • 各种PagedList构建器(旧的兼容性路径)不再在调用DataSource.Factory.create()时错误地同步调用主线程。.build()被调用。(b/182798948

3.0.0-beta02版本

2021年3月10日

androidx.paging:paging-*:3.0.0-beta02已发布。3.0.0-beta02版本包含这些提交。

API 变更

  • Rx3扩展现在正确传播@ExperimentalCoroutinesApi Opt-In要求。之前它们在@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版本包含这些提交。

API 变更

  • Rx2和Rx3包装器现在公开了它所依赖的实验性注解。如果您在paging-rxjava2或paging-rxjava3中使用Rx兼容包装器,您现在需要使用@OptIn(ExperimentalCoroutinesApi::class)注解用法(Ib1f9d

错误修复

  • 修复了使用v2 DataSource API通过兼容性路径时有时会抛出的IndexOutOfBoundsException: Inconsistency detected错误。
  • 通过兼容性路径使用时,DataSource初始化期间的isInvalid调用现在已正确地在fetchDispatcher上启动,而不是在主线程上。这修复了使用Room的PagingSource实现时由于在主线程上访问数据库而导致的IllegalStateException错误。

3.0.0-alpha13版本

2021年1月27日

androidx.paging:paging-*:3.0.0-alpha13已发布。3.0.0-alpha13版本包含这些提交。

API 变更

  • PagingSource.getRefreshKey不再是可选实现,它现在是一个没有默认实现的抽象函数。迁移用户可以继续返回默认实现,该实现只是返回null,但getRefreshKey()应该有一个真正的实现,返回一个基于用户当前滚动位置的键,如果可能,允许Paging通过PagingState.anchorPosition继续围绕视口加载。(I4339a
  • InvalidatingPagingSourceFactory现在是最终类(Ia3b0a
  • 允许使用附加的可选SeparatorType参数配置终端分隔符(页眉/页脚)行为。这两个选项是
    • 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版本包含这些提交。

API 变更

  • InvalidatingPagingSourceFactory不再是抽象类,因为它从未有过任何抽象方法。(I4a8c4
  • 为Java用户添加了.cachedIn()的重载,它接受ViewModel而不是Lifecycle或CoroutineScope。(I97d81b/175332619
  • 允许Java调用者以异步方式使用PagingData转换操作,方法是将Executor接受到转换运算符参数中。所有-Sync转换运算符现在都已删除-Sync后缀,Kotlin协程用户需要通过调用接受挂起块的扩展函数来消除歧义。所有PagingData转换运算符都已移动到静态PagingDataTransforms类下的扩展名中。Java用户需要通过静态帮助程序调用它们,例如PagingDataTransforms.map(pagingData, transform)对于Kotlin用户,语法相同,但您需要导入函数。(If6885b/172895919

错误修复

  • 修复了一个错误,该错误会导致在已达到分页结束时,RemoteMediator.load()不会在adapter.refresh()期间被调用。

3.0.0-alpha11版本

2020年12月16日

androidx.paging:paging-*:3.0.0-alpha11已发布。3.0.0-alpha11版本包含这些提交。

新功能

  • 为以下基本用例添加了保存状态支持(完整的支持,尤其是在分层源的情况下,仍在进行中)
    • flow被缓存并且应用程序没有被杀死(例如,flow被缓存在一个视图模型中,并且活动在进程中被重新创建)
    • 分页源已计数,启用了占位符并且布局未交错。

API 变更

  • PagingSource.getRefreshKey()现在是稳定API(I22f6fb/173530980
  • PagingSource.invalidate不再是开放函数。如果您需要在无效化发生时收到通知,请考虑调用registerInvalidatedCallback方法,而不是覆盖invalidate。(I628d9b/173029013b/137971356
  • Pager现在在其常规构造函数旁边有一个单独的实验性构造函数,而不是通过opt-in注解将实验性API泄漏到非实验性公共API中。(I9dc61b/174531520
  • 更新了便利属性CombinedLoadStates.refreshCombinedLoadStates.prependCombinedLoadStates.append,只有在中介器和源加载状态均为NotLoading后,才从Loading转换到NotLoading,以确保已应用远程更新。(I65619)
  • LoadParams.pageSize已被删除(它已被弃用)。建议在您的PagingSource中使用LoadParams.loadSize

    LoadParams.loadSize始终等于PagingConfig.pageSize,除了初始加载调用,它等于PagingConfig.initialLoadSize

    如果您正在测试您的Paging2 DataSource而没有使用Pager或PagedList,如果您也设置了initialLoadSize,则pageSize可能与PagingConfig.pageSize不匹配。如果这对您的测试很重要,请尝试使用Pager/PagedList,它会在内部为您的DataSource加载方法设置正确的PageSize。(I98ac7b/149157296

错误修复

  • 修复了使用分隔符和PagingConfig.maxSize设置时由于IllegalStateException导致的崩溃。(I0ed33b/174787528
  • 修复了一个错误,该错误会导致在初始加载后,如果设置了RemoteMediator,则PREPEND/APPEND的loadState不会立即更新为NotLoading(endOfPaginationReached = true)I8cf5a
  • 修复了一个错误,该错误会导致诸如.snapshot()、.peek()等的演示者端API在ListUpdateCallback更新中返回之前的(过时的)列表。
  • 修复了一个错误,该错误会导致在与RemoteMediator一起使用时,Separators运算符不会添加页眉或页脚。
  • 修复了一个错误,该错误会导致RemoteMediator的LoadState更新为NotLoading卡在Loading状态。
  • 修复了一个错误,该错误会导致Paging2.0兼容性API,.asPagingSourceFactory(),可能导致后备DataSource在不正确的CoroutineDispatcher上初始化。这解决了崩溃和可能的ANR情况,尤其是在使用Room当前的PagingSource实现时,该实现使用了此兼容性路径。

3.0.0-alpha10版本

2020年12月2日

androidx.paging:paging-*:3.0.0-alpha10已发布。3.0.0-alpha10版本包含这些提交。

API 变更

  • 已弃用的dataRefreshFlowdataRefreshListener API已被删除,因为它们与loadStateFlow/Listener更新冗余。对于那些迁移的人,loadStateFlow等效项是

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

    Ib5570b/173530908

错误修复

  • RemoteMediator REFRESH的endOfPaginationReached现在已正确传播到LoadState更新,并阻止远程APPENDPREPEND触发。(I94a3fb/155290248
  • 由于初始页面为空或过滤过于严格而呈现空列表将不再阻止Paging启动PREPENDAPPEND加载。(I3e702b/168169730
  • 修复了一个问题,该问题会导致在快速无效化发生时,getRefreshKey不会在PagingSource的后续生成中被调用。(I45460b/170027530

外部贡献

  • 添加了一个新的抽象类InvalidatingPagingSourceFactory,它带有一个.invalidate() API,该API将invalidate转发到它发出的所有PagingSource。感谢@claraf3!(Ie71fcb/160716447

已知问题

  • 使用RemoteMediator时,来自.insertSeparators()转换的页眉和页脚可能不会立即出现 b/172254056
  • 使用RemoteMediator可能会导致远程LoadState卡住,如果无效化和PagingSource.load(LoadParams.Refresh(...))RemoteMediator.load()返回之前完成 b/173717820

3.0.0-alpha09版本

2020年11月11日

已发布 androidx.paging:paging-*:3.0.0-alpha093.0.0-alpha09 版本包含以下提交。

API 变更

  • 使用 replaceWith 语句完全弃用 dataRefreshFlow/Listener 方法。(I6e2dd

错误修复

  • 修复了在使用分隔符与 RemoteMediator 并且在仍在运行的远程加载将返回 endOfPagination 时触发无效操作时抛出 IllegalArgumentException 的问题。(I3a260

3.0.0-alpha08 版本

2020年10月28日

已发布 androidx.paging:paging-*:3.0.0-alpha083.0.0-alpha08 版本包含以下提交。

API 变更

  • 通过函数式接口(Kotlin 1.4 中可用)启用 SAM 转换,将 DataSource.InvalidatedCallback 的 Kotlin/Java 变体合并。这也修复了通过 .map.mapByPage 转换后未调用 Kotlin 变体的无效回调的错误。(I1f244b/165313046

错误修复

  • Paging 与 ViewPager 的交互已得到显著改进。具体来说,Paging 将不再由于页面无效而取消 RemoteMediator#load 调用。如果需要 REFRESH,它也不会再发出追加/预取加载请求,直到 REFRESH 请求成功完成。(I6390bb/162252536
  • 为 androidx 启用了 MissingGetterMatchingBuilder 的 API lint 检查。(I4bbeab/138602561
  • 修复了 .withLoadState* ConcatAdapter 帮助程序由于从后台线程通知 RecyclerView 而崩溃的错误。(I18bb5b/170988309
  • 修复了加载非常小的非空页面有时会阻止预取正确触发加载的错误。Iffda3 b/169259468

3.0.0-alpha07 版本

2020年10月1日

已发布 androidx.paging:paging-*:3.0.0-alpha073.0.0-alpha07 版本包含以下提交。

API 变更

  • 异步 PagingData 基于 Guava 的运算符现在接受 Executor 作为参数,以控制执行上下文。(Id4372

错误修复

  • 修复了由于竞争条件而在 RemoteMediator 中抛出的 IndexOutOfBounds 异常。(I00b7fb/165821814
  • 修复了 DataSource -> PagingSource 转换中的竞争条件,该条件可能导致生成的 PagingSource 忽略来自 DataSource 的无效信号。
  • 修复了页面获取逻辑中的一个问题,该问题有时会导致它无法获取 PagingSource 的新版本,直到调用 PagingDataAdapter.refresh()。
  • 修复了与 RemoteMediator 结合使用时,将 DataSource 转换为 PagingSource(例如 Room 生成的那个)有时会导致滚动位置丢失的问题。

外部贡献

  • 感谢 @simonschiller 添加了基于 RxJava2、RxJava3 和 Guava 的异步转换运算符以用于 PagingData!

3.0.0-alpha06 版本

2020年9月2日

已发布 androidx.paging:paging-*:3.0.0-alpha063.0.0-alpha06 版本包含以下提交。

API 变更

  • 每当调用 PagingDataAdapter.setHasStableIds 时,现在都会抛出带有更清晰消息的 UnsupportedOperationException,以说明缺乏对稳定 ID 的支持。(Ib3890b/158801427

错误修复

  • insertSeparators 不再过滤掉空页面,允许演示者即使在插入许多空页面的情况下也能遵守预取距离。(I9cff6b/162538908

3.0.0-alpha05 版本

2020年8月19日

已发布 androidx.paging:paging-*:3.0.0-alpha053.0.0-alpha05 版本包含以下提交。

错误修复

  • 即使呈现的数据被大量过滤,Paging 现在也能正确预取页面。
  • 返回 LoadResult.Error 到重试加载不再导致项目访问错误地重新触发重试。

外部贡献

  • 感谢 Clara F 帮助清理了一些测试!(549612

3.0.0-alpha04 版本

2020年8月5日

已发布 androidx.paging:paging-*:3.0.0-alpha043.0.0-alpha04 版本包含以下提交。

API 变更

  • 添加了 peek() API 到 AsyncPagingDataDifferPagingDataAdapter 以允许访问呈现的数据而无需触发页面加载。(I38898b/159104197
  • 添加了 snapshot() API 到 PagingDataAdapterAsyncPagingDataDiffer 以允许检索呈现的项目而无需触发页面获取。(I566b6b/159104197
  • 添加了 PagingData.from(List<T>) 构造函数以允许呈现静态列表,该列表可以与整体 PagingData 流组合以在某些状态下显示静态列表,例如,在初始 REFRESH 完成之前或只是为了测试转换。(Id134d
  • 弃用 dataRefresh Flow/Listener API,因为它们旨在公开呈现项目的 REFRESH 状态,但随着 loadState Flow/Listener 回调时间的改进以及 itemCount 属性的改进,它们是多余的。(Ia19f3
  • 添加了 PagingSourceRemoteMediator 的 RxJava3 兼容性包装器。(I49ef3b/161480176

错误修复

  • 通过 toPagingSourceFactory 帮助程序将 PositionalDataSource 转换为 PagingSource,包括 Room 生成的 PagingSource 现在正确地标记自己以支持跳转。(I3e84cb/162161201
  • 修复了使用同步变体的 submitData 有时会导致竞争,从而导致 ClosedSendChannelException 的错误。(I4d702b/160192222

外部贡献

  • 感谢 Zac Sweers 代表 Slack 添加了 RxJava3 兼容性包装器!(I49ef3b/161480176

3.0.0-alpha03 版本

2020年7月22日

已发布 androidx.paging:paging-*:3.0.0-alpha033.0.0-alpha03 版本包含以下提交。

API 变更

  • PagingState 的构造函数现在是公共的,这应该会使测试 getRefreshKey() 的实现更容易。(I8bf15
  • 从 Java 中隐藏了 DataSource kotlin map 函数变体,以解决原始变体和 kotlin 变体之间的歧义。(If7b23b/161150011
  • 旨在为 Kotlin 用户提供便利的冗余 API 已标记为 @JvmSynthetic。(I56ae5
  • 添加了 LoadResult.Page 构造函数的重载,它将 itemsBefore 和 itemsAfter 的默认值设置为 COUNT_UNDEFINED。(I47849
  • 使现有的 PagingData 运算符能够接受挂起方法,并为 Java 用户引入了新的 mapSync、flatMapSync 和 filterSync 非挂起运算符。现有的转换方法已移动到扩展函数,因此 Kotlin 用户现在需要导入它们。(I34239b/159983232

错误修复

  • Room(和 PositionalDataSource)PagingSource 现在将显示作为第一页一部分的前导分隔符,因此用户无需滚动即可查看它。(I6f747b/160257628
  • 占位符上的项目访问现在会正确触发 PagingSource 加载,直到返回一个页面,该页面在经过 PagingData.filter() 转换后满足请求的索引。(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-alpha023.0.0-alpha02 版本包含以下提交。

API 变更

  • 添加了具有常用默认值的 PagingConfig 构造函数的重载。(I39c50b/158576040
  • 添加了具有常用默认值的 PagingDataAdapterAsyncPagingDataDiffer 构造函数的重载。(Ie91f5
  • 适配器 API,dataRefreshFlowdataRefreshListener 现在传递一个布尔值来指示 PagingData 是否为空。(I6e37eb/159054196
  • 为 RemoteMediator 添加了 RxJava 和 Guava API - RxRemoteMediatorListenableFutureRemoteMediator
  • 为 PagingState 添加了用于常见项目访问的帮助程序,例如 isEmpty()firstItemOrNull()。(I3b5b6b/158892717

错误修复

  • Pager 现在检查工厂中 PagingSource 的重用,以防止意外重用无效的 PagingSource,这会导致不明确的错误。(I99809b/158486430
  • 来自 RemoteMediator REFRESH 的故障不再阻止 PagingSource 加载。(I38b1bb/158892717
  • 在调用 submitData 的挂起版本之后,submitData 的非挂起版本不再因在多个 PagingData 上并发集合而导致崩溃。(I26358b/158048877
  • 修复了配置更改后可能出现的“无法从 Pager 收集两次”异常 (I58bccb/158784811)

3.0.0-alpha01 版本

2020 年 6 月 10 日

已发布 androidx.paging:paging-*:3.0.0-alpha013.0.0-alpha01 版本包含这些提交。

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.22.1.2 版本包含这些相对于 2.1.0 版本的提交。

错误修复

  • 修复了在极少数情况下在失效期间转换位置时出现的 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.12.1.1 版本包含这些提交。

错误修复

  • 禁用占位符时,来自 PositionalDataSource 的连续初始加载现在以上次访问为中心。

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 包含两个主要新增功能 - 页面删除和每个构件的 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 替代方案。
  • 添加了 AsyncPagedListDiffer.addPagedListListener() 用于监听何时交换 PagedList。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 版本已发布,包含一个错误修复。

错误修复

  • 修复了使用 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.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 正式进入候选发布阶段,与最初的 alpha 版本相比没有变化。

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 将处于 beta 阶段很短时间。我们不打算对 Paging 1.0 进行进一步的 API 更改,任何 API 更改的门槛都非常高。

Alpha RxJava2 对 Paging 的支持作为单独的可选模块 (android.arch.paging:rxjava2:1.0.0-alpha1) 发布,并在稳定之前将暂时单独进行版本控制。

此新库提供了一个 RxJava2 替代方案来替代 LivePagedListBuilder,能够构建 ObservableFlowable,使用 Scheduler 而不是 Executor

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 在指定的执行程序上触发初始 PagedList 加载,而不是 Arch Components IO 线程池。

  • 修复了内部 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 进入 beta 之前的最终版本。

API 变更

  • DataSource.LoadParams 对象现在具有公共构造函数,并且DataSource.LoadCallback 对象现在是抽象的。这使得可以使用模拟回调来包装DataSource 或直接测试DataSourceb/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 已从接口更改为抽象类,以启用映射功能。

错误修复

  • 将构建器更改为 final。b/70848565
  • Room DataSource 实现现在已修复以处理多表查询 - 此修复包含在 Room 1.1.0-beta1 中,请参见上文。
  • 修复了一个 bug,即如果启用了占位符并且总大小是页面大小的精确倍数,则BoundaryCallback.onItemAtEndLoaded 不会为PositionalDataSource 调用。

版本 1.0.0-alpha5

2018 年 1 月 22 日

错误修复

  • 修复禁用占位符时的页面加载 b/70573345
  • 添加日志记录以跟踪 IllegalArgumentException bug b/70360195(以及推测性的 Room 端修复)
  • Javadoc 示例代码修复 b/70411933b/71467637