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

时间:2018-06-28 00:47:42

标签: android android-architecture-components android-mvvm android-livedata

我有这个FormDataMultiPart multipart = (FormDataMultiPart) new FormDataMultiPart() .field("TypeFacture", templateName) .bodyPart(new FileDataBodyPart("fichier", new File("test.txt"))); 从网络上获取列表,然后用数据填充ViewModelRecyclerView返回了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

forceRefresh = true

它将设置override fun onRefresh() { viewModel.fetchLists(organizationId, forceRefresh = true) } 的值并触发转换,然后调用网络。

但是,在我的情况下,我会从RecyclerView的适配器中清除数据。如果在那之后,用户单击一个按钮,我想再次触发观察者,以便我用getListsObservable已经获取的数据重新填充适配器。我不想在这一点上调用forceRefresh,因为我确定我已经有了数据,并且我想再次触发观察者,以便用现有数据更新UI。由于此时organizationId不为null,所以以后再调用getListParams.value时什么也没有发生。

有什么想法可以用当前的设置实现?

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

更好的方法是具有扩展功能。

我的扩展功能如下:

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

呼叫者函数如下所示,

mutableLiveDataObject.forceRefresh()

快乐编码!

答案 2 :(得分:0)

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

if(mainViewModel.mutable!=null&&mainViewModel.mutable.getValue())
mainViewModel.mutable.setValue(mainViewModel.mutable.getValue());