具有多个实时数据对象的活动

问题描述 投票:0回答:1

我在房间db中有一张桌子,其中包含卡片列表。我的片段中有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);
                });
}

MyViewModel

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

public LiveData<List<MyModel>> getSecondData(String cardDetailId) {
        return myDao.getItems(cardDetailId);
    }
android mvvm android-room android-viewmodel
1个回答
0
投票
  1. 当您将Room与LiveData一起使用时-Room-framework会生成一些低层的样板代码,当表中发生某些更改时,这些代码将负责调用该魔术“回调”。看起来像一个:

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

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

  1. 如果您的RecyclerViewAdapter使用的是DiffUtils(如果未使用,请开始执行此操作),那么定期更新RecyclerView就不会有麻烦。实际上,不会更新,因为数据列表未更改。
© www.soinside.com 2019 - 2024. All rights reserved.