Mat*_*hbl 6 android android-mvvm android-livedata android-architecture-components
我有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
}
}
}
Run Code Online (Sandbox Code Playgroud)
片段的onActivityCreated:
override fun onActivityCreated(savedInstanceState: Bundle?) {
...
viewModel.getListsObservable().observe(this, Observer { // populate RecyclerView })
viewModel.fetchLists(organizationId)
}
Run Code Online (Sandbox Code Playgroud)
由于getListParams.value第一次为null,它将设置getListsParams.value = organizationId并触发,switchMap并调用存储库以从网络获取列表。
当我想强制刷新(通过拉至刷新)并再次调用网络时,可以使用forceRefresh = true:
override fun onRefresh() {
viewModel.fetchLists(organizationId, forceRefresh = true)
}
Run Code Online (Sandbox Code Playgroud)
它将设置的值organizationId并触发转换,然后将调用网络。
但是,有一种情况是我从RecyclerView的适配器中清除了数据。如果在那之后,用户单击按钮,我想再次触发观察者,以便我用getListsObservable已经获取的数据重新填充适配器。我不想在这一点上调用forceRefresh,因为我确定我已经有了数据,并且我想再次触发观察者,以便使用现有数据更新我的UI。由于此时getListParams.value不为null,所以以后再调用时什么也没有发生fetchLists(organizationId)。
是否知道如何使用当前设置实现该目标?
Nar*_*him 19
是的,洪端给出的答案是完美的。我只是要在这里扩展这个答案,
更好的做法是使用扩展功能。
我的扩展功能看起来像这样,
fun <T> MutableLiveData<T>.forceRefresh() {
this.value = this.value
}
Run Code Online (Sandbox Code Playgroud)
调用函数看起来像这样,
mutableLiveDataObject.forceRefresh()
Run Code Online (Sandbox Code Playgroud)
快乐编码!!
再试removeObservers()一次observe():
viewModel.getListsObservable().removeObservers(this)
viewModel.getListsObservable().observe(this, Observer { // populate RecyclerView })
Run Code Online (Sandbox Code Playgroud)
因为:
如果LiveData已经有数据集,则会将其传递给观察者。
请参阅文档。
或者您可以更改getListsObservable()返回 a MutableLiveData,然后setValue手动调用:
fun loadCurrentData() {
getListsObservable.value = getListsObservable.value
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |