[英]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.