具有无限滚动功能的RecyclerView的Android MVVM / ViewModel(加载更多内容)-如何在配置更改时处理数据

时间:2018-09-07 14:23:16

标签: android mvvm android-viewmodel

所以我有一个RecyclerView,它可以无限滚动。我首先对我的API进行网络调用,并获得包含20个项目的首页。

在我的ViewModel(下面的代码)中,我有一个可观察到的事件,它使用页码触发存储库中的网络调用。

因此,当用户滚动到底部时,页码将增加,并触发另一个网络请求。

这是我的ViewModel中的代码:

private val scheduleObservable = Transformations.switchMap(scheduleParams) { params: Map<String, Any> ->
    ScheduleRepository.schedule(params["organizationId"] as String, params["page"] as Int)
}

// This is the method I call in my Fragment to fetch another page
fun fetchSchedule(organizationId: String, page: Int) {
  val params = mapOf(
      "organizationId" to organizationId,
      "page" to page
  )
  scheduleParams.value = params
}

fun scheduleObservable() : LiveData<Resource<Items>> {
    return scheduleObservable
}

在我的片段中,我观察到scheduleObservable,当它发出数据时,我将它们附加到RecyclerView的适配器中:

viewModel.scheduleObservable().observe(this, Observer {
    it?.data?.let {    
        if (!isAppending) {
            adapter.replaceData(it)
        } else {
            adapter.addData(it)
        }
    }
})  

当前实现的问题是,在配置更改时,我重新绑定了观察者,而可观察对象则发出最后一个获取的数据。就我而言,它将仅发出最后获取的页面。

从配置更改中恢复过来时,我想获取到此为止的所有项目的完整列表,以便我可以用这些重新填充适配器。

我想知道什么是解决此问题的最佳方法。我应该有两个可观察物吗?我应该在ViewModel中创建一个列表变量来存储所有获取的项目并将该列表用于我的适配器吗?

我在GitHub上检查了android-architecture-components,但是相对于我的需求(没有数据库,没有分页库等),这通常是过大的,而且我迷路了,因为我仍在努力将精力集中在架构组件上。

0 个答案:

没有答案