【问题标题】:Creating another PagingSource for a different API resource?为不同的 API 资源创建另一个 PagingSource?
【发布时间】:2020-08-06 00:46:29
【问题描述】:
假设我有一个显示动物列表的 API 资源,我们称之为 /animals,如果我要使用 Android 的新的 Paging3 库,我是否必须为它们创建两个单独的 PagingSourceobjects?用于分页的Codelab 有一个扩展PagingSource 的类,称为GithubPagingSource,但它仅用于一个端点。我想知道正确的方法是什么。
【问题讨论】:
标签:
android
android-paging
android-paging-library
【解决方案1】:
PagingSource 的单个实例应该代表支持数据集的快照,这基本上意味着如果一个页面被同一个实例删除并重新加载,则应该输出同一个页面。
但是,您可以拥有一个实现并创建它的多个实例,因此可能会推荐这样的方法:
class AnimalPagingSource(val species: String?): PagingSource<..> {
override suspend fun load(...): LoadResult<..> {
val result = if (species != null) {
return networkApi.getSpecies(species)
} else {
return networkApi.getAnimals()
}
return LoadResult.Page(result.data, ...)
}
}
稍后当你需要使用由此产生的 Flow> 时,你可以在多个 Pager 之间切换:
speciesFlow
.flatMapLatest { species ->
Pager(...) { AnimalPagingSource(species) }.flow
}
.cachedIn(scope)
.collectLatest { pagingData ->
adapter.submitData(pagingData)
}