Обновление RecyclerView новым LiveData <List>, возвращаемым из комнаты, динамически - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть обычное приложение Room-> DAO-> Livedata-> Repositiry-> ViewModel-> RecyclerView. Различные кнопки пользовательского интерфейса должны передавать разные списки данных в RecyclerView.
Нажатием кнопки я хочу:

  1. Создать новый @Query в DAO и получить взамен новый объект LiveData <`List>.
  2. Поместите эти новые данные в 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.

Итак, есть два вопроса:

  1. Как можноЯ просто вызываю onChanged () моего Обозревателя?
  2. Есть ли какой-нибудь другой стильный способ динамической передачи нового объекта LiveData в RecyclerView?

1 Ответ

1 голос
/ 06 ноября 2019

1)

В viewModel создайте метод получения для живых данных:

//...

private LiveData<List<Entry>> liveData;

//...

public LiveData<List<Entry>> getLiveData() {
    return liveData;
}

в Activity:

  @Override
  protected void onCreate(Bundle savedInstanceState) {

      //...

      viewModel.getLiveData().observe(this, new Observer<List<Entry>>() {
          @Override
          public void onChanged(List<Entry> entryList) {
              //set new value here
          }
      });

  }

2) DiffUtil очень полезен для обновления вашего списка в представлении переработчика и дает вам несколько хороших анимаций.

...