簡體   English   中英

如何動態修改 PagingSource 類中的變量,Paging Library 3.0

[英]How to dynamically modify variables in PagingSource class, Paging Library 3.0

我有一個名為selectedModuleTab的實時數據,它包含一些變量,例如過濾器,我需要將這些過濾器傳遞給數據源存儲庫crmRepo以便從服務器獲取數據。

我剛開始使用 Paging Library 3.0,每次我的過濾器更改時,我都無法弄清楚如何修改PagingSource 類

我嘗試使用轉換,但是每次過濾器更改時我都需要創建尋呼機,這會導致返回此視圖后滾動位置丟失。

每次實時數據更改時如何修改 PageSource 類 (selectedModuleTab)?

在我的 ViewModel 中,我有這個 LiveData:

    val recordsList = Pager(PagingConfig(pageSize = 10),
    pagingSourceFactory = { RecordListPagingSource(crmRepo, selectedModuleTab.value) })
    .liveData
    .cachedIn(viewModelScope)

這是我的 PageSource 類:

    class RecordListPagingSource(private val crmRepo: CrmRepository, private val moduleTab: ModuleTab?) :
    PagingSource<Int, SmallRecordModel>() {
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, SmallRecordModel> {
        return try {
            val page = params.key ?: 0
            LoadResult.Page(
                data = crmRepo.getRecordsListFromModuleSuspended(
                    ACCOUNT_MODULE,
                    (page * 10),
                    moduleTab?.tabFilters,
                    moduleTab?.tabLayout
                ),
                prevKey = page - 1,
                nextKey = page + 1
            )
        } catch (e: Exception) {
            LoadResult.Error(e)
        }
    }
}

我這樣做的一種方法是在PagingSource之外制作load功能。

我不知道您的結構如何,但這就是我進行類似實現的方式。

每個 Tab 的 ViewModel,用於保存加載頁面的邏輯,並保持僅與選項卡相關的分頁狀態。 或者,如果 API(或函數)相同,則您傳遞過濾器的一個ViewModel 然后,更改您的Paging Source以接收 Suspended Function 參數,該參數會告訴Paging Source如何加載數據。 或者,將 Filter 參數傳遞到Paging Source (假設您選擇了一個通用的ViewModel )。

這樣,每個頁面都知道需要加載哪些數據,而Paging Source只加載頁面,同時保持一個通用的加載功能。

根據個人經驗,使用掛起的函數參數,因為它使 PagingSource 可重用,獨立於您正在使用的頁面,甚至獨立於數據的類型。


PS:如果您不熟悉開發應用程序或使用庫,請不要使用 Alpha 版本,因為有時它們包含未完全確定的邏輯或功能,因為有時功能或邏輯可能會在以后更改。

我剛剛遇到了一個與RemoteMediator類似的問題,為此我試圖為網絡調用更改其構造函數的參數。

愚蠢的是,我認為在構建Pager期間必須在RemoteMediator (或您的情況下的PagingSource )中創建一個匿名實例(如示例代碼中)。

但是,你可以簡單地暴露PagingSource / RemoteMediator -instance在你的RepositoryViewModelPagingSource “你想改變是構造函數的屬性public var是如此,你可以callling之前更改這些屬性” refresh()PagingDataAdapter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM