データベースのLiveDataのオブザーバーからはデータを取得しません

Znerual:

私は何をしたいです

私は月からすべてのデータを選択するクエリで埋めますRecyclingViewに接続ルームのデータベースを持っています。月には、ユーザーが変更することができ、私は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);
        }
    });
}

コード全体を見ることができ、ここで

ピエルルイジ:

あなたのコードでは、あなたはLiveDataあなたがonNextMonth関数を呼び出すたびに必要としますが、決して古いLiveDataを抜いていません。だから、もっとして1人のオブザーバー更新RecyclerViewを持っています。あなたは現在LiveDataを保存する必要がありますし、onNextMonth機能では、最初にあなたは、そのオブザーバを削除する必要があります。コード

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

LiveDataの値が非同期で更新されるため、動作しない可能性があり、このコード行を削除します。最後の提案は、あなたがフラグメントである場合は、LifecycleOwnerとしてviewLifecycleの終わりではない、これを使用する必要があるということです。

  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=362568&siteId=1