[英]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 使用页面信息并相应地返回页面。
您当前一次退回所有项目可能是正确的。
这里有两个主要策略:
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 切换。为了能够使用分页库实现分页,您需要使用分页 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.