[英]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在你的Repository
或ViewModel
和PagingSource
“你想改變是構造函數的屬性public var
是如此,你可以callling之前更改這些屬性” refresh()
在PagingDataAdapter
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.