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

Posted

技术标签:

【中文标题】如何判断 jetpack-compose 分页是不是有效?【英文标题】:How to tell if jetpack-compose pagination is working?如何判断 jetpack-compose 分页是否有效? 【发布时间】:2021-11-06 14:15:30 【问题描述】:

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

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

谁能指点一下?

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)

【问题讨论】:

【参考方案1】:

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

您可能是正确的,您当前正在一次退回所有物品。

【讨论】:

【参考方案2】:

这里有两个主要策略:

    load() 中添加足够长的delay(),以便您有足够的时间在新页面加载之前滚动到列表末尾
class RssListSource(): PagingSource<Int, RssItem>() 
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, RssItem> 
  delay(5000)
  ...

    观察LazyPagingItems.loadState 的变化并寻找在Loading 和NotLoading 之间的PREPEND 或APPEND 切换。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于如何判断 jetpack-compose 分页是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis分页

内存治理常识点总结

django 做了搜索之后再做分页 结果显示第一页是正常的 但是按下一页后显示出整个主页的第二页

pageHelper-v4.2源码阅读-分页是怎么实现运行的?

jquery easyui 分页是怎么把page 和 rows 传到后台的

前台分页,以及类别选择