我有这个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)
时没有任何反应。
知道如何通过我当前的设置实现这一目标吗?
再次尝试removeObservers()
和observe()
:
viewModel.getListsObservable().removeObservers(this)
viewModel.getListsObservable().observe(this, Observer { // populate RecyclerView })
因为:
如果LiveData已经有数据集,它将被传递给观察者。
见docs。
或者也许你可以改变getListsObservable()
返回MutableLiveData
,然后手动调用setValue
:
fun loadCurrentData() {
getListsObservable.value = getListsObservable.value
}
是的,红段给出的答案是完美的。我只想在这里扩展答案,
更好的方法是使用扩展功能。
我的扩展功能如下所示,
fun <T> MutableLiveData<T>.forceRefresh() {
this.value = this.value
}
来电功能看起来像这样,
mutableLiveDataObject.forceRefresh()
快乐编码!!