繁体   English   中英

如何判断 jetpack-compose 分页是否有效?

[英]How to tell if jetpack-compose pagination is working?

如何判断分页是否正常工作? 我看过的所有示例都涉及使用retrofit apiservice ,它似乎正在返回数据页,但我正在拉下单个 rss 提要并将其解析为一个巨大的List<POJO> 我怀疑我的PagingSource正在将整个列表加载到一页中,但我不知道如何判断。

我的列表有近 1000 个项目,所以我认为实现某种分页/DiffUtil 是一种很好的做法。 我正在使用androidx.paging:paging-compose:1.0.0-alpha12使用jetpack compose玩这个,这可能会使事情复杂化。

谁能给我一些指点?

class RssListSource(): PagingSource<Int, RssItem>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, RssItem> {
        return try {

            val nextPage = params.key ?: 1
            val rssList: List<RssItem> = RssFeedFetcher().fetchRss()

            LoadResult.Page(
                data = rssList,
                prevKey = if (nextPage == 1) null else nextPage - 1,
                nextKey = nextPage.plus(1)
            )
        } catch (e: Exception){
            LoadResult.Error(e)
        }
    }
}
class MainActivityViewModel: ViewModel() {
    val rss: Flow<PagingData<RssItem>> = Pager(PagingConfig(pageSize = 10)){
        RssListSource()  // returned to LazyPagingItems list in @Composable 
    }.flow.cachedIn(viewModelScope)
}

您的数据仍然需要一种方法来获取数据页。 我希望您的 RssFeedFetcher 使用页面信息并相应地返回页面。

您当前一次退回所有项目可能是正确的。

这里有两个主要策略:

  1. load()添加足够长的delay() ,以便您有足够的时间在新页面加载之前滚动到列表的末尾
class RssListSource(): PagingSource<Int, RssItem>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, RssItem> {
  delay(5000)
  ...
}
  1. 观察对LazyPagingItems.loadState更改,并查找 Loading 和 NotLoading 之间的 PREPEND 或 APPEND 切换。

为了能够使用分页库实现分页,您需要使用分页 API,这意味着在您的示例中,您需要一种以分页方式获取 RSS 的方法。 不幸的是,如果您的数据源不提供查询分页数据的方法,分页库将无法使用分页。

您可以通过实现一个中间件来获取 RSS 提要并将其拆分为多个页面,以便您从 Android 应用程序进行查询,从而实现您想要的功能。

编辑:另一种方法可能是让后台任务(使用 Android WorkManager)下载 RSS 提要并将其保存在 Room 数据库中,然后使用 Paging 库从数据库加载页面。 以下是如何显示 Room 数据库中的分页数据的摘要: https : //developer.android.com/topic/libraries/architecture/paging/v3-network-db

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM