簡體   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