分页
此表列出了 androidx.paging
组中的所有构件。
构件 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
paging-* | 3.3.4 | - | - | - |
paging-compose | 3.3.4 | - | - | - |
声明依赖项
要添加对 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
之类的错误。(Ia9400,b/331684448)
3.3.2 版本
2024 年 8 月 7 日
已发布 androidx.paging:paging-*:3.3.2
版本。3.3.2 版本包含这些提交。
新功能
3.3.1 版本
2024 年 7 月 24 日
已发布 androidx.paging:paging-*:3.3.1
版本。3.3.1 版本包含这些提交。
错误修复
- 修复了当后台数据源在滚动时刷新时,
AsyncPagingDataDiffer
或在其之上构建的 API(例如与RecyclerView
一起使用的PagingDataAdapter
)无法触发更多加载的问题。(I60ca5,b/352586078) - 修复了在使用
PagingDataAdapter
或AsyncPagingDataDiffer
滚动RecyclerView
时,从后台数据源中删除项目时发生的崩溃。(I8c65a,b/347649763)
3.3.0 版本
2024 年 5 月 14 日
已发布 androidx.paging:paging-*:3.3.0
版本。3.3.0 版本包含这些提交。
自 3.2.0 版本以来的重要更改
PagingDataPresenter
现在是公共类。现在可以在PagingDataPresenter
之上构建多平台演示器,而无需内部 Paging API 或paging-runtime
的AsyncPagingDataDiffer
。- 在
LoadStates
和CombinedLoadStates
中添加了新的辅助方法hasError
和isIdle
,分别用于检查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-runtime
、paging-guava
、paging-rxjava2
和paging-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
注解来进行通用代码。(I78f0d,b/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-runtime
的AsyncPagingDataDiffer
。(Id1f74,b/315214786)- 添加了新的
LoadStates
和CombinedLoadStates
辅助方法,用于检查LoadStates
是否处于错误或NotLoading
状态。还添加了一个新的 API,它等待LoadStateFlow
直到加载已稳定到NotLoading
或错误状态。(Id6c67)
行为变更
PagingData.empty()
现在默认情况下会分派NotLoading
状态,除非其构造函数传递自定义LoadStates
。这与现有行为不同,现有行为是在提交到PagingDataAdapter
时不分派LoadStates
,或者在作为LazyPagingItems
收集时分派 Loading 状态。当作为LazyPagingItems
收集时,它现在还将在初始组合后立即显示空列表。(I4d11d,b/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-runtime
、paging-guava
、paging-rxjava2
和paging-rxjava3
将仍然仅限于 Android。
API 变更
- 仅供内部使用的公共 Logger 接口已被弃用。(I16e95,b/288623117)
外部贡献
- 感谢 Cash App 的 veyndan 帮助将 Paging 迁移到 Kotlin 多平台。(#560,#561,#562,#573,#576,#577,#578,#579,#580,#581,#583,#584,#586,#609)
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
),请使用提供LoadStates
的PagingData.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
可组合项以进行预览。 - 支持所有惰性布局,例如
LazyVerticalGrid
和HorizontalPager
,以及来自 Wear 和 TV 库的自定义惰性组件。这是通过新的低级别LazyPagingItems
扩展方法itemKey
和itemContentType
实现的,它可以帮助您为LazyColumn
、LazyVerticalGrid
以及HorizontalPager
等API中已存在的标准items
API实现key
和contentType
参数。 - 仅支持
LazyListScope
的items(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
允许您通过scrollTo
或appendScrollWhile
等API模拟应用程序的UI,以便您可以验证分页数据集中任何点的快照数据是否正确。
- 添加了默认日志,以便在两个级别(
VERBOSE
和DEBUG
)公开分页调试信息。可以通过命令adb shell setprop log.tag.Paging [DEBUG|VERBOSE]
启用日志。这适用于使用视图的分页和使用 Compose 的分页。 - 添加了
PagingDataAdapter
和AsyncPagingDataDiffer
的构造函数,它们接受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 包含这些提交。
外部贡献
版本 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 变更
- 从 Paging Compose 中删除了已弃用的
items(LazyPagingItems)
和itemsIndexed(LazyPagingItems)
API。有关其替换 API 的示例,请参阅Paging Compose1.0.0-alpha20
发行说明。(I9626e)
版本 3.2.0-alpha06
2023年5月24日
androidx.paging:paging-*:3.2.0-alpha06
已发布。版本 3.2.0-alpha06 包含这些提交。
新功能
- 添加了一个新的
PagingSourceFactory
函数接口,它比现有的() -> PagingSource
lambda 提供更明确的 API 表面。此工厂可用于实例化Pager
。(I33165,b/280655188) - 添加了新的
paging-testing
API 的List<Value>.asPagingSourceFactory()
,以获取仅从不可变数据列表加载的PagingSourceFactory
。对于使用多代静态数据进行测试,仍应使用现有的Flow<List<Value>>
扩展函数。(Id34d1,b/280655188)
API 变更
- 现在,
paging-testing
中的所有公共 API 都使用@VisibleForTesting
进行注释,以确保这些 API 仅在测试中使用。(I7db6e) asSnapshot
API 不再需要传入CoroutineScope
。它现在默认为使用从其父作用域继承的上下文。(Id0a78,b/282240990)- 重新排序了
TestPager
构造函数参数,以直观地匹配真实Pager
构造函数参数顺序(I6185a) - 将
paging-testing
中 lambda 类型() -> PagingSource<Key, Value>
迁移到类型PagingSourceFactory<Key, Value>
。(I4a950,b/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
以从初始刷新加载中检索数据。(Ied354,b/277233770)
文档改进
- 更新了关于
asPagingSourceFactory()
的文档,以阐明它是Flow
上的扩展方法,它返回一个用于生成PagingSource
实例的可重用工厂。(I5ff4f,I705b5) - 更新了
LoadResult.Page
构造函数的文档,以阐明需要重写itemsBefore
和itemsAfter
以支持跳转。(Ied354)
外部贡献
- 感谢Veyndan为将 Paging 从 Android/JVM 特定功能中分离出来做出的贡献。(#525,#523,#520,#519,#507,#506,#505,#499,#497,#496,#493)
版本 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 模拟一个数据源来收集数据。(I6f230,b/235528239)paging-testing
构件已扩展为包含新的API,适用于验证Flow<PagingData<T>>
中包含的数据是否正确。例如,这可用于断言ViewModel层中Flow<PagingData<T>>
的输出。这是通过
Flow<PagingData<Value>>
上的asSnapshot
Kotlin 扩展函数完成的,该函数将Flow<PagingData<Value>>
转换为直接的List<Value>
。asSnapshot
lambda 允许您通过诸如scrollTo
或appendScrollWhile
之类的 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 协程。(I55fd2,I5bd26,I7ce34,I51f4d,I2249f,Id6223,Ic4bab,Ib29b9,Ic1238,I96def,b/235528239)
API 变更
- 现在已正确标记
AsyncPagingDataDiffer
和PagingDataAdapter
中对getItem
和peek
的 UI 调用,使其只能在主线程上调用。(I699b6) - 移除了
TestPager
使用的泛型类型中的通配符,从而更轻松地在用 Java 编写的代码中使用这些方法的结果。(I56c42)
3.2.0-alpha03 版本
2022 年 10 月 24 日
已发布 androidx.paging:paging-*:3.2.0-alpha03
。 3.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
方法传递的PagingState
的pages
属性)时使用 Kotlin 标准库flatten
方法。(Ie0718)
3.2.0-alpha02 版本
2022 年 8 月 10 日
已发布 androidx.paging:paging-*:3.2.0-alpha02
。 3.2.0-alpha02 版本包含这些提交。
新功能
- Paging 现在通过
AsyncPagingDataDiffer
或PagingDataAdapter
类提供日志,以公开从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-alpha01
。 3.2.0-alpha01 版本包含这些提交。
API 变更
- 添加了
PagingDataAdapter
和AsyncPagingDataDiffer
的构造函数,它们接受CoroutineContext
而不是CoroutineDispatcher
。(Idc878) - 默认情况下,
PagingData.from()
和PagingData.empty()
将不再影响演示者端的CombinedLoadStates
。已添加一个允许将sourceLoadStates
和remoteLoadStates
传递给这些构造函数的新重载,以保持设置LoadStates
为完全终端(即NotLoading(endOfPaginationReached = false)
)的现有行为,并可以选择在需要时包含远程状态。如果未传递LoadStates
,则当演示者接收到静态PagingData
时,将保持演示者端的先前CombinedLoadStates
。(Ic3ce5,b/205344028)
错误修复
PagingSource.getRefreshKey()
的结果现在在返回 null 但设置了非 nullinitialKey
的情况下被正确优先于initialKey
。(Ic9542,b/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 版本包含这些提交。
错误修复
- 移除了由
.cachedIn()
错误插入的各代之间出现的中间LoadState.NotLoading
事件。此更改通过移除在重试失败的加载、刷新或失效期间产生的冗余LoadState.NotLoading
事件,使对LoadState
更改做出反应变得容易得多。
3.1.0 版本
2021 年 11 月 17 日
已发布 androidx.paging:paging-*:3.1.0
。 3.1.0 版本包含这些提交。
自 3.0.0 版本以来的重要更改
Flow<PagingData>.observable
和Flow<PagingData>.flowable
API 不再是实验性的- 对
LoadState
的行为更改- 对于
PagingSource
和RemoteMediator
,endOfPaginationReached
现在对于LoadType.REFRESH
始终为false
- 来自 Paging 的
LoadStates
现在会在发出下游数据之前等待PagingSource
和RemoteMediator
的有效值。新一代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-rc01
。 3.1.0-rc01 版本包含这些提交。
错误修复
- 修复了 .cachedIn() 中的竞争条件 + 内存泄漏,在 Paging 下游发送多个加载事件但没有观察者或观察者切换到新的 PagingData 时。(Ib682e)
3.1.0-beta01 版本
2021 年 10 月 13 日
已发布 androidx.paging:paging-*:3.1.0-beta01
。 3.1.0-beta01 版本包含这些提交。
错误修复
- 修复了一个问题,即许多快速的项目访问可能会导致它们被丢弃以供 prefetchDistance 考虑,从而导致页面加载停滞。当许多项目一次以优先加载与用户滚动方向相反的顺序布局时,尤其会出现此问题。现在缓冲这些项目访问并同步优先处理,以防止它们被丢弃。(aosp/1833273)
3.1.0-alpha04 版本
2021 年 9 月 29 日
已发布 androidx.paging:paging-*:3.1.0-alpha04
。 3.1.0-alpha04 版本包含这些提交。
API 变更
Flow<PagingData>.observable
和Flow<PagingData>.flowable
API 不再是实验性的。(Ie0bdd)
错误修复
- 对于 LoadStates,
endOfPaginationReached
现在对于LoadType.REFRESH
始终为false
。之前,对于 RemoteMediatorREFRESH
,endOfPaginationReached
可能为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,尽管仍然强烈建议这样做。(I0b2b5,b/177351336,b/195028524).loadStateFlow
和.addLoadStateListener
在 presenter API 上不再冗余地发送一个初始CombinedLoadStates
,该状态始终将中介器状态设置为null
,并将源状态设置为NotLoading(endOfPaginationReached = false)
。这意味着- 如果使用 RemoteMediator,中介器状态将始终填充。
- 在
.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 类型的检查。(Id6bd3,b/191806126,b/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 的初始加载完成,无论新一代是否对显示的项目进行了任何更改。即,如果列表完全相同,则新一代完成初始加载且没有更新仍会触发此回调。
- 插入页面,即使插入的页面不包含新项目。
- 删除页面,即使删除的页面为空。(I272c9,b/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 发送空操作差异事件的问题,这可能会导致某些监听器过早触发。(Ic507f,b/182510751)
外部贡献
- 向 rxjava3 工件添加了弃用的 PagedList 兼容性 API。(Id1ce2,b/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
。(I8a78d,b/194544557)
错误修复
- 在
LazyPagingItems
中收集的来自pager.flow.cachedIn
的缓存数据现在将在状态恢复后立即可用,无需异步收集。这意味着缓存数据在状态恢复后的初始合成时即可立即呈现。(I97a60,b/177245496)
1.0.0-alpha19 版本
2023年5月3日
androidx.paging:paging-compose:1.0.0-alpha19
已发布。1.0.0-alpha19 版本包含这些提交。
支持所有惰性布局
以前,Paging Compose 在 LazyListScope
上提供自定义的 items
和 itemsIndexed
扩展方法,这意味着您无法将 Paging Compose 与其他惰性布局一起使用,例如 LazyVerticalGrid
、HorizontalPager
或 Wear 和 TV 库提供的其他自定义惰性组件。解决这种缺乏灵活性是此版本的 主要更新。
为了支持更多惰性布局,我们需要在不同的层构建 API——而不是为每个惰性布局提供自定义的 items
API,Paging Compose 现在在 LazyPagingItems
中提供稍微更低级别的扩展方法 itemKey
和 itemContentType
。这些 API 侧重于帮助您实现标准 items
API 的 key
和 contentType
参数,这些 API 已经存在于 LazyColumn
、LazyVerticalGrid
以及 HorizontalPager
等 API 中的等效项。(Ifa13b,Ib04f0,b/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 的更多示例,请参阅 我们的示例。
虽然这些更改确实使 LazyColumn
和 LazyRow
示例长了几行,但我们认为所有惰性布局的一致性对于将来使用 Paging Compose 的用户来说是一个重要因素。因此,现有的 LazyListScope
扩展方法现已弃用。(I0c459,I92c8f,b/276989796)
API 变更
- 为了简化向新API的迁移,
LazyListScope
上的items
和itemsIndexed
扩展函数现在支持contentType
参数,与新API中的支持相呼应。(Ib1918,b/255283378)
依赖项更新
- Paging Compose已将其依赖项从Compose 1.0.5更新到Compose 1.2.1。(Ib1918,b/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 版本包含这些提交。
新功能
- 添加了在调用
collectLazyPagingItems
时支持自定义CoroutineContext
的功能。(I7a574,b/243182795,b/233783862)
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-alpha15
与paging-common:3.1.1
或更低版本一起使用时,缺少PagingDataDiffer
构造函数错误的问题。(b/235256201,b/239868768)
1.0.0-alpha15 版本
2022 年 6 月 1 日
androidx.paging:paging-compose:1.0.0-alpha15
版本已发布。1.0.0-alpha15 版本包含这些提交。
API 变更
- 添加了
PagingDataAdapter
和AsyncPagingDataDiffer
的构造函数,它们接受CoroutineContext
而不是CoroutineDispatcher
。(Idc878)
错误修复
LazyPagingItems
现在将初始loadState
设置为具有LoadState.Loading
刷新。(I55043,b/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]
。(I086cb,b/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一起使用。(Ie2446,b/171872064,b/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.refresh
、CombinedLoadStates.prepend
、CombinedLoadStates.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
中提供的相同功能。(Iddfe8,b/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 版本包含这些提交。
错误修复
- 访问
LivePagedList
或RxPagedList
生成的初始值中的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 发送空操作差异事件的问题,这可能会导致某些监听器过早触发。(Ic507f,b/182510751)
3.0.0-beta03 版本
2021年3月24日
androidx.paging:paging-*:3.0.0-beta03
版本已发布。3.0.0-beta03 版本包含这些提交。
错误修复
- 我们已经彻底修改了列表重新加载时占位符的处理方式,以防止RecyclerView中出现意外跳转。有关详细信息,请参阅NullPaddedDiffing.md。(If1490,b/170027529,b/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的公共使用的限制(I6aa29,b/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。这允许页眉和页脚与初始加载同步呈现,这可以防止用户需要滚动才能看到终端分隔符。(Ibe993,b/174700218)
错误修复
- 修复了一个罕见的内存泄漏问题,该问题发生在PageFetcher甚至开始从PagingSource加载之前,PagingSource就被无效化。(I9606b,b/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。(I97d81,b/175332619)
- 允许Java调用者以异步方式使用PagingData转换操作,方法是将Executor接受到转换运算符参数中。所有-Sync转换运算符现在都已删除-Sync后缀,Kotlin协程用户需要通过调用接受挂起块的扩展函数来消除歧义。所有PagingData转换运算符都已移动到静态PagingDataTransforms类下的扩展名中。Java用户需要通过静态帮助程序调用它们,例如
PagingDataTransforms.map(pagingData, transform)
对于Kotlin用户,语法相同,但您需要导入函数。(If6885,b/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(I22f6f,b/173530980)PagingSource.invalidate
不再是开放函数。如果您需要在无效化发生时收到通知,请考虑调用registerInvalidatedCallback方法,而不是覆盖invalidate。(I628d9,b/173029013,b/137971356)- Pager现在在其常规构造函数旁边有一个单独的实验性构造函数,而不是通过opt-in注解将实验性API泄漏到非实验性公共API中。(I9dc61,b/174531520)
- 更新了便利属性
CombinedLoadStates.refresh
、CombinedLoadStates.prepend
、CombinedLoadStates.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。(I98ac7,b/149157296)
错误修复
- 修复了使用分隔符和PagingConfig.maxSize设置时由于IllegalStateException导致的崩溃。(I0ed33,b/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 变更
已弃用的
dataRefreshFlow
和dataRefreshListener
API已被删除,因为它们与loadStateFlow/Listener更新冗余。对于那些迁移的人,loadStateFlow等效项是loadStateFlow.distinctUntilChangedBy { it.refresh } .filter { it.refresh is NotLoading }
错误修复
- RemoteMediator
REFRESH
的endOfPaginationReached现在已正确传播到LoadState更新,并阻止远程APPEND
和PREPEND
触发。(I94a3f,b/155290248) - 由于初始页面为空或过滤过于严格而呈现空列表将不再阻止Paging启动
PREPEND
或APPEND
加载。(I3e702,b/168169730) - 修复了一个问题,该问题会导致在快速无效化发生时,
getRefreshKey
不会在PagingSource的后续生成中被调用。(I45460,b/170027530)
外部贡献
- 添加了一个新的抽象类InvalidatingPagingSourceFactory,它带有一个
.invalidate()
API,该API将invalidate转发到它发出的所有PagingSource。感谢@claraf3!(Ie71fc,b/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-alpha09
。3.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-alpha08
。3.0.0-alpha08 版本包含以下提交。
API 变更
- 通过函数式接口(Kotlin 1.4 中可用)启用 SAM 转换,将
DataSource.InvalidatedCallback
的 Kotlin/Java 变体合并。这也修复了通过.map
或.mapByPage
转换后未调用 Kotlin 变体的无效回调的错误。(I1f244,b/165313046)
错误修复
- Paging 与 ViewPager 的交互已得到显著改进。具体来说,Paging 将不再由于页面无效而取消
RemoteMediator#load
调用。如果需要 REFRESH,它也不会再发出追加/预取加载请求,直到 REFRESH 请求成功完成。(I6390b,b/162252536) - 为 androidx 启用了 MissingGetterMatchingBuilder 的 API lint 检查。(I4bbea,b/138602561)
- 修复了
.withLoadState*
ConcatAdapter
帮助程序由于从后台线程通知 RecyclerView 而崩溃的错误。(I18bb5,b/170988309) - 修复了加载非常小的非空页面有时会阻止预取正确触发加载的错误。Iffda3 b/169259468
3.0.0-alpha07 版本
2020年10月1日
已发布 androidx.paging:paging-*:3.0.0-alpha07
。3.0.0-alpha07 版本包含以下提交。
API 变更
- 异步 PagingData 基于 Guava 的运算符现在接受 Executor 作为参数,以控制执行上下文。(Id4372)
错误修复
- 修复了由于竞争条件而在 RemoteMediator 中抛出的 IndexOutOfBounds 异常。(I00b7f,b/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-alpha06
。3.0.0-alpha06 版本包含以下提交。
API 变更
- 每当调用
PagingDataAdapter.setHasStableIds
时,现在都会抛出带有更清晰消息的UnsupportedOperationException
,以说明缺乏对稳定 ID 的支持。(Ib3890,b/158801427)
错误修复
- insertSeparators 不再过滤掉空页面,允许演示者即使在插入许多空页面的情况下也能遵守预取距离。(I9cff6,b/162538908)
3.0.0-alpha05 版本
2020年8月19日
已发布 androidx.paging:paging-*:3.0.0-alpha05
。3.0.0-alpha05 版本包含以下提交。
错误修复
- 即使呈现的数据被大量过滤,Paging 现在也能正确预取页面。
- 返回
LoadResult.Error
到重试加载不再导致项目访问错误地重新触发重试。
外部贡献
- 感谢 Clara F 帮助清理了一些测试!(549612)
3.0.0-alpha04 版本
2020年8月5日
已发布 androidx.paging:paging-*:3.0.0-alpha04
。3.0.0-alpha04 版本包含以下提交。
API 变更
- 添加了
peek()
API 到AsyncPagingDataDiffer
和PagingDataAdapter
以允许访问呈现的数据而无需触发页面加载。(I38898,b/159104197) - 添加了
snapshot()
API 到PagingDataAdapter
和AsyncPagingDataDiffer
以允许检索呈现的项目而无需触发页面获取。(I566b6,b/159104197) - 添加了
PagingData.from(List<T>)
构造函数以允许呈现静态列表,该列表可以与整体 PagingData 流组合以在某些状态下显示静态列表,例如,在初始 REFRESH 完成之前或只是为了测试转换。(Id134d) - 弃用 dataRefresh Flow/Listener API,因为它们旨在公开呈现项目的 REFRESH 状态,但随着 loadState Flow/Listener 回调时间的改进以及 itemCount 属性的改进,它们是多余的。(Ia19f3)
- 添加了
PagingSource
和RemoteMediator
的 RxJava3 兼容性包装器。(I49ef3,b/161480176)
错误修复
- 通过
toPagingSourceFactory
帮助程序将PositionalDataSource
转换为PagingSource
,包括 Room 生成的PagingSource
现在正确地标记自己以支持跳转。(I3e84c,b/162161201) - 修复了使用同步变体的 submitData 有时会导致竞争,从而导致
ClosedSendChannelException
的错误。(I4d702,b/160192222)
外部贡献
- 感谢 Zac Sweers 代表 Slack 添加了 RxJava3 兼容性包装器!(I49ef3,b/161480176)
3.0.0-alpha03 版本
2020年7月22日
已发布 androidx.paging:paging-*:3.0.0-alpha03
。3.0.0-alpha03 版本包含以下提交。
API 变更
- PagingState 的构造函数现在是公共的,这应该会使测试 getRefreshKey() 的实现更容易。(I8bf15)
- 从 Java 中隐藏了 DataSource kotlin map 函数变体,以解决原始变体和 kotlin 变体之间的歧义。(If7b23,b/161150011)
- 旨在为 Kotlin 用户提供便利的冗余 API 已标记为 @JvmSynthetic。(I56ae5)
- 添加了 LoadResult.Page 构造函数的重载,它将 itemsBefore 和 itemsAfter 的默认值设置为 COUNT_UNDEFINED。(I47849)
- 使现有的 PagingData 运算符能够接受挂起方法,并为 Java 用户引入了新的 mapSync、flatMapSync 和 filterSync 非挂起运算符。现有的转换方法已移动到扩展函数,因此 Kotlin 用户现在需要导入它们。(I34239,b/159983232)
错误修复
- Room(和 PositionalDataSource)PagingSource 现在将显示作为第一页一部分的前导分隔符,因此用户无需滚动即可查看它。(I6f747,b/160257628)
- 占位符上的项目访问现在会正确触发 PagingSource 加载,直到返回一个页面,该页面在经过 PagingData.filter() 转换后满足请求的索引。(I95625,b/158763195)
- 修复了在 PagingSource 返回错误后滚动有时会阻止 PagingDataAdapter.retry() 重试的错误。(I1084f,b/160194384)
- 修复了在丢弃页面后,项目访问可能不会加载页面,即使项目访问在 prefetchDistance 内的问题。(Ie95ae,b/160038730)
- 设置 PagingConfig.maxSize 不再在丢弃事件后启用占位符。(I2be29,b/159667766)
3.0.0-alpha02 版本
2020年6月24日
已发布 androidx.paging:paging-*:3.0.0-alpha02
。3.0.0-alpha02 版本包含以下提交。
API 变更
- 添加了具有常用默认值的
PagingConfig
构造函数的重载。(I39c50,b/158576040) - 添加了具有常用默认值的
PagingDataAdapter
和AsyncPagingDataDiffer
构造函数的重载。(Ie91f5) - 适配器 API,
dataRefreshFlow
和dataRefreshListener
现在传递一个布尔值来指示PagingData
是否为空。(I6e37e,b/159054196) - 为 RemoteMediator 添加了 RxJava 和 Guava API - RxRemoteMediator 和 ListenableFutureRemoteMediator
- 为 PagingState 添加了用于常见项目访问的帮助程序,例如
isEmpty()
和firstItemOrNull()
。(I3b5b6,b/158892717)
错误修复
- Pager 现在检查工厂中 PagingSource 的重用,以防止意外重用无效的 PagingSource,这会导致不明确的错误。(I99809,b/158486430)
- 来自 RemoteMediator REFRESH 的故障不再阻止 PagingSource 加载。(I38b1b,b/158892717)
- 在调用
submitData
的挂起版本之后,submitData
的非挂起版本不再因在多个PagingData
上并发集合而导致崩溃。(I26358,b/158048877) - 修复了配置更改后可能出现的“无法从 Pager 收集两次”异常 (I58bcc,b/158784811)
3.0.0-alpha01 版本
2020 年 6 月 10 日
已发布 androidx.paging:paging-*:3.0.0-alpha01
。3.0.0-alpha01 版本包含这些提交。
Paging 库已更新到 3.0 版本,以启用多个主要的新功能。
3.0 版本的新功能
- 对 Kotlin 协程和 Flow 的一流支持。
- 支持使用 协程挂起函数、RxJava Single 或 Guava ListenableFuture 原语 的异步加载。
- 用于响应式 UI 设计的 内置加载状态和错误信号,包括重试和刷新功能。
- 对存储库层的改进
- 简化的数据源接口
- 简化的网络 + 数据库分页
- 取消支持
- 对表示层的改进
已知问题
- 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 版本的提交。
错误修复
- 修复了在极少数情况下在失效期间转换位置时出现的
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 版本包含这些提交。
错误修复
- 禁用占位符时,来自 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
中发布) 修复了PagedListAdapter
和AsyncPagedListDiffer
无法发出移动事件的崩溃。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
相同。
错误修复
- 修复了
PagedListAdapter
和AsyncPagedListDiffer
无法发出移动事件的崩溃。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
,能够构建 Observable
和 Flowable
,使用 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.Builder
和LivePagedListBuilder
中)。将
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
或直接测试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
已从接口更改为抽象类,以启用映射功能。
错误修复
- 将构建器更改为 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/70411933,b/71467637