我有这个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)
}
Since getListParams.value
第一次为null,会设置getListsParams.value = organizationId
并触发switchMap
并调用存储库从网络获取列表。
当我想强制刷新(通过拉刷新)并再次调用网络时,我可以使用forceRefresh = true
:
override fun onRefresh() {
viewModel.fetchLists(organizationId, forceRefresh = true)
}
它将设置的值organizationId
并触发将调用网络的转换。
但是,我有一个场景,我从 RecyclerView 适配器中清除数据。如果之后,用户单击按钮,我想再次触发观察者,以便我使用 getListsObservable 已获取的数据重新填充适配器。我不想在这一点上调用forceRefresh,因为我确定我已经拥有数据,我只想再次触发观察者,以便我的 UI 使用现有数据进行更新。自从getListParams.value
此时不为空,那么当我调用时什么也不会发生fetchLists(organizationId)
稍后的。
知道如何通过当前的设置实现这一目标吗?