16

我有这个ViewModel从网络获取列表并RecyclerView用数据填充 a (MyAvailabilityRepository返回 a 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第一次为null,它将设置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)稍后调用时不会发生任何事情。

知道如何使用当前设置实现这一目标吗?

4

3 回答 3

20

是的,洪端给出的答案是完美的。我只是在这里扩展这个答案,

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

我的扩展功能看起来像这样,

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

调用者函数看起来像这样,

mutableLiveDataObject.forceRefresh()

编码快乐!!

于 2019-04-05T14:37:40.150 回答
4

再试removeObservers()一次observe()

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

因为:

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

请参阅文档

或者,也许您可​​以将 更改getListsObservable()为返回 a MutableLiveData,然后setValue手动调用:

fun loadCurrentData() {
    getListsObservable.value = getListsObservable.value
}
于 2018-06-28T01:15:54.413 回答
1

我确实通过这种方法强制刷新 -

if (mainViewModel.mutable != null && mainViewModel.mutable.getValue()) {
    mainViewModel.mutable.setValue(mainViewModel.mutable.getValue());
}
于 2020-08-03T03:54:05.633 回答