繁体   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