не получая данные от LiveData наблюдателя базы данных

Znerual:

Что я хочу

У меня есть база данных номеров подключен к RecyclingView, который наполняется с помощью запроса выбора всех данных от одного месяца. Месяц может быть изменен пользователем, и я хочу, чтобы RecyclingView обновить данные каждый раз, когда пользователь изменяет месяц.

проблема

RecyclingView получает правильные данные для стартового месяца (перед пользователем изменил значение). Но после того, как пользователь активирует функцию onNextMonthClick, то RecyclingView пуст (что хорошо в течение следующего месяца), но остается пустым, даже когда мы вернулись на оригинальном месяц.

Уже попробовал

Используя мой журнал, я обнаружил, что метод OnChange () в onNextMonthClicked () никогда триггера, когда есть данные за месяц, но это вызывает, если нет данных в этом месяце.

Как я могу загрузить мои данные снова?

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);
        }
    });
}

Весь код можно найти здесь

Пьерлуиджи:

в вашем коде вам требуется LiveData каждый раз, когда вы звоните onNextMonth функции, но вы никогда не будет отключать старые LiveData. Таким образом, у вас есть более одного наблюдателя обновления RecyclerView. Вы должны сохранить текущие LiveData и в onNextMonth функции, сначала вы должны удалить его наблюдатель. Код

adapter.setEntries(mDiaryViewModel.getmEntriesMonth((month)).getValue());

не может работать, потому что значение LiveData обновляется асинхронно, удалите эту строку кода. Последнее предположение, что если вы находитесь в фрагменте вы должны использовать viewLifecycle конца не это как LifecycleOwner:

  mDiaryViewModel.getmEntriesMonth(month).observe(getViewLifecycle(), new 
             Observer<List<Diary>>() {
    @Override
    public void onChanged(List<Diary> diaries) {
        adapter.setEntries(diaries);
    }
});

рекомендация

отhttp://43.154.161.224:23101/article/api/json?id=362565&siteId=1