【问题标题】: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)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2012-05-21
      • 2020-06-07
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多