为不同的 API 资源创建另一个 PagingSource?
Creating another PagingSource for a different API resource?
假设我有一个显示动物列表的 API 资源,我们称它为 /animals
,并且我有另一个用于使用物种搜索动物列表的资源,/animals/{species}
,如果我要使用 Android 的新 Paging3 库,我是否必须为它们创建两个单独的 PagingSource
对象?用于分页的 Codelab 有一个扩展 PagingSource
的 class,称为 GithubPagingSource
,但它仅用于一个端点。我想知道正确的方法是什么。
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>时,可以在多个Pagers之间切换:
speciesFlow
.flatMapLatest { species ->
Pager(...) { AnimalPagingSource(species) }.flow
}
.cachedIn(scope)
.collectLatest { pagingData ->
adapter.submitData(pagingData)
}
假设我有一个显示动物列表的 API 资源,我们称它为 /animals
,并且我有另一个用于使用物种搜索动物列表的资源,/animals/{species}
,如果我要使用 Android 的新 Paging3 库,我是否必须为它们创建两个单独的 PagingSource
对象?用于分页的 Codelab 有一个扩展 PagingSource
的 class,称为 GithubPagingSource
,但它仅用于一个端点。我想知道正确的方法是什么。
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
speciesFlow
.flatMapLatest { species ->
Pager(...) { AnimalPagingSource(species) }.flow
}
.cachedIn(scope)
.collectLatest { pagingData ->
adapter.submitData(pagingData)
}