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