java - 没有从数据库的 LiveData 观察者获取数据
问题描述
我想要的是
我有一个连接到 RecyclingView 的 Room 数据库,该数据库由一个查询填充,从一个月中选择所有数据。用户可以更改月份,我希望 RecyclingView 在用户每次更改月份时刷新数据。
问题
RecyclingView 获取起始月份的正确数据(在用户更改值之前)。但是在用户调用 onNextMonthClick 函数后,RecyclingView 是空的(下个月没问题),但即使我们回到原来的月份,它仍然是空的。
已经试过了
使用我的日志,我发现 onNextMonthClicked() 中的 onChange() 方法在当月有数据时永远不会触发,但如果本月没有数据就会触发。
如何再次加载我的数据?
month = Dates.getMonth();
mDiaryViewModel = new ViewModelProvider(this).get(DiaryViewModel.class);
mDiaryViewModel.getmEntriesMonth(month).observe(this, new Observer<List<Diary>>() {
@Override
public void onChanged(List<Diary> diaries) {
adapter.setEntries(diaries);
}
});
}
public void onNextMonthClick(View view) {
if (month < 12) {
month += 1;
} else {
month = 1;
}
adapter.setEntries(mDiaryViewModel.getmEntriesMonth((month)).getValue());
mDiaryViewModel.getmEntriesMonth(month).observe(this, new Observer<List<Diary>>() {
@Override
public void onChanged(List<Diary> diaries) {
adapter.setEntries(diaries);
}
});
}
整个代码可以在这里找到
解决方案
在您的代码中,您每次调用 onNextMonth 函数时都需要一个 LiveData,但您永远不会拔掉旧的 LiveData。所以你有不止一个观察者更新 RecyclerView。您应该保存当前的 LiveData 并在 onNextMonth 函数中,首先您应该删除它的观察者。编码
adapter.setEntries(mDiaryViewModel.getmEntriesMonth((month)).getValue());
无法工作,因为 LiveData 的值是异步更新的,请删除这行代码。最后一个建议是,如果您在 Fragment 中,您应该使用 viewLifecycle end 而不是 this 作为 LifecycleOwner:
mDiaryViewModel.getmEntriesMonth(month).observe(getViewLifecycle(), new
Observer<List<Diary>>() {
@Override
public void onChanged(List<Diary> diaries) {
adapter.setEntries(diaries);
}
});
推荐阅读
- excel - 从字典中获取信息并将其设置在 excel-vba 的单元格中
- batch-file - 如何设置批处理文件 .txt 输出保存位置
- automation - 使用 mqtt 回调中的数据创建 IF 语句的正确方法
- python - 如何递归地将矩形打包成正方形
- javascript - 如何使用 Javascript 调用 CSS 动画
- javascript - 检查 document.getElementById 是否不存在?
- netlify - Netlify 上的鹈鹕网站
- facebook - 使用 facebook 营销 api 创建与 instagram 帖子相关的广告
- android - Scrollview vs Recyclerview vs Viewpager vs Coordinator layout
- c# - Unity C# Char 级别系统多场景