如何判断 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 分页是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章
django 做了搜索之后再做分页 结果显示第一页是正常的 但是按下一页后显示出整个主页的第二页
pageHelper-v4.2源码阅读-分页是怎么实现运行的?