首页 > 解决方案 > 具有多个实时数据对象的活动

问题描述

我的房间数据库中有一张包含卡片列表的表格。我的片段中有 2 个回收站视图。需要根据卡片 ID 填充这些回收站视图。每当此表发生更改时,实时数据都会回调两个回收器视图。相反,我希望如果更新了特定的卡片 d,那么只有实时数据才会更新我的 UI。现在,如果有任何 id 数据正在更新,我会回调两个回收站视图。例如,如果 d 传递的是“Sbi”,那么如果 sbi 数据行发生变化,则只更新第一个回收器视图而不是第二个回收器视图。此外,如果传递的 id 是“sbi”,则暂时忽略其他 id 中的更新。

活动

@Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

myViewModel.getFirstData("Sbi")).observe(this,
                result -> {
                    myFirstAdapter.addList(result);
                });

myViewModel.getSecondData("Sbi1").observe(this,
                result -> {
                    mySecondAdapter.addList(result);
                });
}

我的视图模型

public LiveData<List<MyModel>> getFirstData(String cardId) {
        return myDao.getItems(cardId);
    }

public LiveData<List<MyModel>> getSecondData(String cardDetailId) {
        return myDao.getItems(cardDetailId);
    }

标签: androidmvvmandroid-roomandroid-viewmodel

解决方案


  1. 当您将 Room 与 LiveData 一起使用时,Room-framework 会在底层生成一些低级样板代码,这些代码负责在表发生某些变化时调用该神奇的“回调”。它看起来像:

    mObserver = new InvalidationTracker.Observer(tableNames) {...

根据文档,此方法“将给定的观察者添加到观察者列表中,如果它观察到的任何表发生变化,它将被通知”。据我了解,Room 不会打开某些“智能模式”,它会在其中分析特定查询的参数(在您的情况下使用“where id:= ...”),并且每当表更改时,它都会调用您的 observe-LiveData-callbacks,无论您在 LiveData 函数中提到什么 id。换句话说,如果您使用 Room,您将在关联的 sqlite-table 中的每次更改时同时提供两个观察回调。

  1. 如果您的 RecyclerViewAdapter 正在使用DiffUtils(如果不使用,请开始这样做),那么您在定期更新 RecyclerView 时不会遇到任何问题。实际上不会有更新,因为数据列表没有改变。

推荐阅读