【问题标题】:How to dynamically modify variables in PagingSource class, Paging Library 3.0如何动态修改 PagingSource 类中的变量,Paging Library 3.0
【发布时间】:2020-11-20 16:49:41
【问题描述】:

我有一个名为 selectedModuleTab 的实时数据,其中包含一些变量,例如 filters 我需要将这些过滤器传递给数据源存储库 crmRepo 以便从服务器获取数据。

我刚开始使用 Paging Library 3.0,但我不知道如何在每次过滤器更改时修改 PagingSource 类

我尝试使用转换,但每次过滤器更改时我都需要创建 Pager,这会导致返回此视图后滚动位置丢失。

如何在每次 livedata 更改 (selectedModuleTab) 时修改 PageSource 类?

在我的 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)
        }
    }
}

【问题讨论】:

    标签: android kotlin mvvm android-jetpack android-paging


    【解决方案1】:

    一种方法是在PagingSource 之外创建load 功能。

    我不知道您的结构如何,但这就是我进行类似实现的方式。

    每个选项卡的视图模型,用于保存加载页面的逻辑,并保持与选项卡相关的分页状态。或者一个ViewModel 通过过滤器,如果API(或函数)相同。 然后,更改您的 Paging Source 以接受 Suspended Function 参数,它知道告诉 Paging Source 如何加载数据。或者,将 Filter 参数传递给Paging Source(假设您选择了一个常见的ViewModel)。

    这样,每个页面都知道需要加载哪些数据,Paging Source 只加载页面,同时保持通用的加载功能。

    根据个人经验,使用suspended 函数参数,因为它使PagingSource 可重用,独立于您正在使用的页面,甚至是数据类型。


    PS :如果您是开发应用程序或使用库的新手,请不要使用 Alpha 版本,因为有时它们包含未完全确定的逻辑或功能,因为有时功能或逻辑可能会在以后发生变化。

    【讨论】:

    • 也许在 viewmodel 中实现 PagingSource ?我的选项卡只是过滤器预设,所以我不认为需要为每个选项卡设置不同的 ViewModel。我不明白如何将过滤器参数传递给 PagingSource,因为我无法观察该类中的 livedata 并在每次数据更改时使其无效。关于挂起函数参数,我是挂起函数和 Kotlin 协程的新手,不知道这意味着什么,但我会查找它。谢谢!
    【解决方案2】:

    我刚刚遇到了与RemoteMediator 类似的问题,为此我试图更改其构造函数的参数以进行网络调用。

    由于愚蠢,我假设在构造 Pager 期间在 RemoteMediator(或您的情况下为 PagingSource)中创建一个匿名实例是必须的(就像在示例代码中一样)。

    但是您可以简单地在您的RepositoryViewModel 中公开PagingSource/RemoteMediator-instance 以及您想要更改为public varPagingSource 的构造函数属性,这样您可以在PagingDataAdapter 上调用refresh() 之前更改这些属性。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2020-12-12
      • 2020-10-09
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2019-11-23
      相关资源
      最近更新 更多