【问题标题】:How to pass data to DataSource from a ViewModel when it is initially loaded初始加载时如何将数据从 ViewModel 传递到 DataSource
【发布时间】:2021-10-06 00:42:04
【问题描述】:

我正在使用 Paging 库从 web 服务获取数据并将其显示在 recyclerview 中。但是,我无法找到在最初加载 DataSource 时加载初始数据的方法 我正在做类似于this tutorial 的事情。

override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, RedditPost>) {}

我想从 ViewModel 传递 User.name、User.age 等。这个函数怎么调用?

【问题讨论】:

  • 您可以使用 LiveData。订阅您的片段/活动中的实时数据。获得结果后将数据发布到 livedata。
  • @AmitKumar 我可以通过这种方式取回数据,我的问题是发送数据以启动进程。后端端点有几个我最初需要传递的必需参数。

标签: android android-paging-library


【解决方案1】:

您并没有具体说明您要传递的内容,因此我将尝试简要介绍这两种情况:

  1. 您需要根据 UI 上下文传递一些动态参数(例如,链接到线程的中间):

PagedList.Builder 或其任何变体(LiveData、Rx 等)有一个 initialKey 参数,您可以在实例化时传入该参数,该参数作为 LoadParams 中的键传递给 DataSource。这需要与您的DataSourceKey 类型相匹配(Int 对应于PositionalDataSource 等)。

  1. 您有一些依赖项不是基于 UI 上下文的动态。

您想通过DataSource 的构造函数传递任何依赖项,在.create() 期间将其传递给DataSource.Factory

编辑:通常,如果您尝试从 UI 上游发送事件并对此做出反应,您将需要执行 .switchMap。你没有提到什么架构或发布任何代码,但假设你使用的是LiveData,它可能看起来像:

ViewModel.kt

val queryFlow = MutableLiveData<String>("initialQuery")
val pagingDataFlow = queryFlow
  .switchMap { query ->
     LivePagedListBuilder(
       dataSourceFactory = MyDataSourceFactory(query),
       config = ...
     )
       ...
       .build()
  }
  .cachedIn(viewModelScope)

这允许您在每个新查询上启动/取消一个新流并将查询传递到您的DataSource.Factory

【讨论】:

  • 我正在尝试多次传递查询字符串,但我找不到说明如何完成此操作的教程。每次用户通过一个全新的搜索查询时,我是否必须使数据源无效并创建一个新的? PagedListBuilder 不允许多次发送动态查询。我能够在开始时从视图模型发送查询并观察实时数据。我想在用户喜欢时传递查询。
  • 我已经更新了我的答案以包含一个小样本......在没有看到你的代码的情况下给你一些你可以复制的东西有点困难,但希望你使用的是LiveData。 Rx 和 Flow 中也存在类似的操作。
猜你喜欢
  • 2020-04-19
  • 2020-03-04
  • 2022-01-21
  • 2016-04-14
  • 1970-01-01
  • 2022-11-25
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多