【问题标题】:How do I manually call the ViewModel observer second time?如何第二次手动调用 ViewModel 观察者?
【发布时间】:2021-09-06 15:57:21
【问题描述】:

我有两个Fragment-s 和RecyclerViewLiveData。当我对第二个片段进行一些更改时,我需要在第一个片段中更新 RecyclerView
所以在更新第二个片段后,我需要在第一个片段中触发onChange 方法。
第一个片段的代码:

item_viewmodel.getAllCategoryModel().observe(getViewLifecycleOwner(), new Observer<List<Items>>() {
    @Override
    public void onChanged(List<Items> myLists) {
       //Observer is already registered, but I need to call it manully from second fragment.
    }
});

我该怎么做?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您可以通过使用共享视图模型来实现这一点,在两个片段中创建一个视图模型实例并相应地使用,有关更多详细信息,请访问此页面link

    【讨论】:

      【解决方案2】:

      您应该尝试使用 Transformations.switchMap() 方法,通过上述方法将第一个 livedata 依赖于第二个 livedata

      这是一个示例类,它在 MutableLiveData 中保存用户字符串的键入名称(例如来自 EditText),并返回一个 LiveData,其中包含具有该名称的用户的用户对象列表。它通过在每次键入的名称更改时重新查询存储库模式对象来填充 LiveData。

      此 ViewModel 将允许观察 UI 在用户 ID 文本更改时“实时”更新。

       class UserViewModel extends AndroidViewModel {
       MutableLiveData<String> nameQueryLiveData = ...
      
       LiveData<List<String>> getUsersWithNameLiveData() {
           return Transformations.switchMap(
               nameQueryLiveData,
                   name -> myDataSource.getUsersWithNameLiveData(name));
       }
      
       void setNameQuery(String name) {
           this.nameQueryLiveData.setValue(name);
       }
      }
      

      Here more about this...

      如果您想要更具体的答案,请发布有关您的 viewModel 的所有代码

      【讨论】:

        【解决方案3】:

        我认为最好的方法是在片段中使用by activityViewModels() kotlin 属性委托并共享宿主活动的Viewmodel 以进行跨片段通信。

        更多关于使用here

        【讨论】:

        • 好吧,我在本教程中尝试过类似的操作:youtu.be/ACK67xU1Y3s 但单个片段中只有一个 onChange 方法是触发器。我观察到与此视频中相同的项目,当我在 frag A 中进行更改时,仅触发 frag A 中的 onChange 方法。与 frag B 进行类比。这就是您在此视频中使用 SharedViewModel 的意思吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多