PagingSource class, Paging Library 3.0中如何动态修改变量
How to dynamically modify variables in PagingSource class, Paging Library 3.0
我有一个名为 selectedModuleTab 的实时数据,其中包含一些变量,例如 filters
我需要将这些过滤器传递到数据源存储库 crmRepo 以便从服务器获取数据。
我刚开始使用 Paging Library 3.0,每次我的过滤器发生变化时,我都不知道如何修改 PagingSource class。
我曾尝试使用转换,但后来我需要在每次过滤器更改时创建 Pager,这会导致在返回到此视图后滚动位置丢失。
每次 实时数据更改 (selectedModuleTab) 时,如何修改 PageSource class?
在我的 ViewModel 中我有这个 LiveData:
val recordsList = Pager(PagingConfig(pageSize = 10),
pagingSourceFactory = { RecordListPagingSource(crmRepo, selectedModuleTab.value) })
.liveData
.cachedIn(viewModelScope)
这是我的 PageSource class:
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
功能
我不知道你的结构如何,但我就是这样实现的。
每个选项卡的 ViewModel,用于保存加载页面的逻辑,并保持仅与选项卡相关的分页状态。或者如果 API(或函数)相同,则一个 ViewModel
用于传递过滤器。
然后,更改您的 Paging Source
以接受暂停函数参数,该参数知道告诉 Paging Source
如何加载数据。或者,将 Filter 参数传递给 Paging Source
(假设您选择了一个常见的 ViewModel
)。
这样,每个页面都知道需要加载哪些数据,Paging Source
只加载页面,同时保持通用的加载功能。
根据个人经验,使用挂起的函数参数,因为它使 PagingSource 可重复使用,而不受您正在使用的页面甚至数据种类的影响。
P.S :如果您是开发应用程序或使用库的新手,请不要使用 Alpha 版本,因为有时它们包含未完全确定的逻辑或功能,有时功能或逻辑可以稍后更改。
我刚刚遇到了与 RemoteMediator
类似的问题,为此我试图更改其网络调用构造函数的参数。
愚蠢的是,我假设在 Pager
的构造过程中必须在 RemoteMediator
(或你的情况下 PagingSource
中创建一个匿名实例(就像在示例代码)。
但是您可以简单地在 Repository
或 ViewModel
中公开 PagingSource
/RemoteMediator
实例和 PagingSource
的构造函数属性想要更改为 public var
,这样您就可以在 PagingDataAdapter
.
上调用 refresh()
之前更改这些属性
我有一个名为 selectedModuleTab 的实时数据,其中包含一些变量,例如 filters 我需要将这些过滤器传递到数据源存储库 crmRepo 以便从服务器获取数据。
我刚开始使用 Paging Library 3.0,每次我的过滤器发生变化时,我都不知道如何修改 PagingSource class。
我曾尝试使用转换,但后来我需要在每次过滤器更改时创建 Pager,这会导致在返回到此视图后滚动位置丢失。
每次 实时数据更改 (selectedModuleTab) 时,如何修改 PageSource class?
在我的 ViewModel 中我有这个 LiveData:
val recordsList = Pager(PagingConfig(pageSize = 10),
pagingSourceFactory = { RecordListPagingSource(crmRepo, selectedModuleTab.value) })
.liveData
.cachedIn(viewModelScope)
这是我的 PageSource class:
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
功能
我不知道你的结构如何,但我就是这样实现的。
每个选项卡的 ViewModel,用于保存加载页面的逻辑,并保持仅与选项卡相关的分页状态。或者如果 API(或函数)相同,则一个 ViewModel
用于传递过滤器。
然后,更改您的 Paging Source
以接受暂停函数参数,该参数知道告诉 Paging Source
如何加载数据。或者,将 Filter 参数传递给 Paging Source
(假设您选择了一个常见的 ViewModel
)。
这样,每个页面都知道需要加载哪些数据,Paging Source
只加载页面,同时保持通用的加载功能。
根据个人经验,使用挂起的函数参数,因为它使 PagingSource 可重复使用,而不受您正在使用的页面甚至数据种类的影响。
P.S :如果您是开发应用程序或使用库的新手,请不要使用 Alpha 版本,因为有时它们包含未完全确定的逻辑或功能,有时功能或逻辑可以稍后更改。
我刚刚遇到了与 RemoteMediator
类似的问题,为此我试图更改其网络调用构造函数的参数。
愚蠢的是,我假设在 Pager
的构造过程中必须在 RemoteMediator
(或你的情况下 PagingSource
中创建一个匿名实例(就像在示例代码)。
但是您可以简单地在 Repository
或 ViewModel
中公开 PagingSource
/RemoteMediator
实例和 PagingSource
的构造函数属性想要更改为 public var
,这样您就可以在 PagingDataAdapter
.
refresh()
之前更改这些属性