У меня есть обычное приложение Room-> DAO-> Livedata-> Repositiry-> ViewModel-> RecyclerView. Различные кнопки пользовательского интерфейса должны передавать разные списки данных в RecyclerView.
Нажатием кнопки я хочу:
- Создать новый @Query в DAO и получить взамен новый объект LiveData <`List>.
- Поместите эти новые данные в RecyclerViewAdapter и вызовите notifyDataSetChanged () для создания новых визуальных элементов List.
The Dao @Query:
@Query("SELECT * FROM entry_table WHERE path LIKE :path ORDER BY priority DESC")
LiveData<List<Entry>> getNotesOfFolder(String path); //Returns LiveData with List of Entries
Программа recyclerView обновляется через onChanged of Observer следующим образом:
public class RecyclerViewActivity extends AppCompatActivity {…
Observer<List<Entry>> entryObserver = new Observer<List<Entry>>() {
@Override
public void onChanged(List<Entry> entries) {
recyclerAdapter.setEntries(entries);
}
};
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.EntryHolder> {…
public void setEntries(List<Entry> entries) {
this.entries = entries; //setting LiveData content to adapter's List (i.e. entries)
notifyDataSetChanged();
Проблема в том, чтомой Observer не вызывает метод onChange, когда LiveData получает новое значение от DAO. Я полагаю, что это потому, что содержимое этой LiveData не ИЗМЕНЕНО, а заменено другим LiveData.
Я попытался повторно подписать Observer на LiveData, и это несколько сработало, но когда я пытаюсь вызвать некоторые обычные запросы Room, такие как@ Удалил, я получил несколько (до 10!) Вызовов onChange, и некоторые из них ведут себя странно и передают неправильный список в RVadapter.
Итак, есть два вопроса:
- Как можноЯ просто вызываю onChanged () моего Обозревателя?
- Есть ли какой-нибудь другой стильный способ динамической передачи нового объекта LiveData в RecyclerView?