我的房间数据库中有一张表,其中包含卡片列表。我的碎片中有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);
}
-
当您将Room与LiveData一起使用时,在后台,Room框架会生成一些低级的锅炉板代码,这些代码负责在表中发生一些更改时调用神奇的"回调"。它看起来像一个:
mObserver = new InvalidationTracker.Observer(tableNames) {...
根据文档,这种方法"将给定的观察者添加到观察者列表中,如果它观察到的任何表发生变化,就会通知它"。据我所知,Room不会打开某些"智能模式",在这种模式下,它会分析特定查询的参数(在您的情况下为"where id=…"(,并且无论您在LiveData函数中提到什么id,只要表发生变化,它都会调用您的observe LiveData回调。换言之,如果您使用Room,那么在关联的sqlite表中的每一次更改都会给两个observe回调。
- 如果您的RecyclerViewAdapter正在使用DiffUtils(如果没有使用,请开始执行此操作(,则定期更新RecyclerView不会有任何问题。实际上不会有更新,因为数据列表并没有改变