Android MVVM - 如何使LiveData发出它拥有的数据(强制触发观察者)

问题描述 投票:5回答:2

我有这个ViewModel从网络获取列表,我填充RecyclerView与数据(MyAvailabilityRepository返回MutableLiveData,这就是为什么我使用Transformations.switchMap):

class MyAvailabilityViewModel : ViewModel() {
    private val getListsParams = MutableLiveData<String>()
    private val getListsObservable = Transformations.switchMap(getListsParams) { 
        organizationId -> MyAvailabilityRepository.getSectionedLists(organizationId) 
    }

    fun getListsObservable() : LiveData<Resource<MutableList<SectionedAvailabilityList>>> {
        return getListsObservable
    }

    fun fetchLists(organizationId: String, forceRefresh: Boolean = false) {
        if (getListsParams.value == null || forceRefresh) {
            getListsParams.value = organizationId
        }
    }
}

片段的onActivityCreated

override fun onActivityCreated(savedInstanceState: Bundle?) {
    ...
    viewModel.getListsObservable().observe(this, Observer { // populate RecyclerView })
    viewModel.fetchLists(organizationId)
}

由于getListParams.value第一次为空,它将设置getListsParams.value = organizationId并触发switchMap并调用存储库以从网络获取列表。

当我想强制刷新(通过pull-to-refresh)并再次调用网络时,我可以使用forceRefresh = true

override fun onRefresh() {
    viewModel.fetchLists(organizationId, forceRefresh = true)
}

它将设置organizationId的值并触发将随后调用网络的转换。

但是,我有一个场景,我从RecyclerView的适配器清除数据。如果之后,用户单击一个按钮,我想再次触发观察者,以便我使用getListsObservable已经获取的数据重新填充适配器。我不想在这个问题上调用forceRefresh我确定我已经拥有了数据,我只想再次触发观察者,以便用现有数据更新我的UI。由于getListParams.value在那时不是空的,所以当我稍后调用fetchLists(organizationId)时没有任何反应。

知道如何通过我当前的设置实现这一目标吗?

android android-architecture-components android-mvvm android-livedata
2个回答
1
投票

再次尝试removeObservers()observe()

viewModel.getListsObservable().removeObservers(this)
viewModel.getListsObservable().observe(this, Observer { // populate RecyclerView })

因为:

如果LiveData已经有数据集,它将被传递给观察者。

docs

或者也许你可以改变getListsObservable()返回MutableLiveData,然后手动调用setValue

fun loadCurrentData() {
    getListsObservable.value = getListsObservable.value
}

1
投票

是的,红段给出的答案是完美的。我只想在这里扩展答案,

更好的方法是使用扩展功能。

我的扩展功能如下所示,

fun <T> MutableLiveData<T>.forceRefresh() {
    this.value = this.value
}

来电功能看起来像这样,

mutableLiveDataObject.forceRefresh()

快乐编码!!

© www.soinside.com 2019 - 2024. All rights reserved.