Изменение элемента LiveData, извлеченного из Room

#android #android-recyclerview #android-room #android-livedata

#Android #android-recyclerview #android-room #android-livedata

Вопрос:

У меня есть simple RecyclerView , который я заполняю LiveData .

Активность:

 viewModel.getBooks().observe(this, books -> booksAdapter.setBooks(books)); 
  

ViewModel:

 public LiveData<List<Book>> getBooks() {
    books = booksRepository.getBooks();
    return books;
}
  

BooksRepository просто вызывает этот DAO метод:

 @Query("SELECT * FROM books")
LiveData<List<Book>> getBooks();
  

Все работает, как ожидалось. Однако в RecyclerView у меня есть LIKE кнопка для каждого элемента, и я хочу создать onClick прослушиватель, который соответствующим образом изменяет флаг книги FAVOURITE . Однако Room не поддерживает это с помощью LiveData , и он также не поддерживает MutableLiveData .
Одним (не очень хорошим) решением было бы отправить приложение на адаптер, где я бы создал репозиторий и обновил объект Book «вручную». Но я знаю, что это не очень хорошая идея для отправки Application в adapter .

Есть идеи, как это сделать? Мне просто нужно установить один простой boolean столбец в сущности Book. Спасибо.

Комментарии:

1. Используете ли вы ListAdapter для Android ( developer.android.com/reference/android/widget/ListAdapter )? Вы должны сделать это или иным образом попробовать вызвать notifyDataSetChanged() из вашего адаптера setBooks() .

Ответ №1:

Обновление значения в наборе livedata не приведет к обновлению базового источника. Я бы рекомендовал обновить ваш DAO так, чтобы, когда пользователь нажимает кнопку «Мне нравится», он обновлял базу данных .. которая затем, в свою очередь, публикует обновление для ваших livedata, и изменения будут отражены в представлении.

например:

 @Query("UPDATE books SET FAVOURITE = :value WHERE books.bookId = :bookId")
public abstract void setBookFavourited(boolean value, int bookId);
  

Также следует отметить, что вам не нужно передавать приложение на адаптер. Настройте интерфейс в адаптере, который сообщает о том, что пользователь нажал кнопку избранного.

В адаптере:

 public interface BookFavoriteListener {
    void onBookFavorited(Book book);
}
  

Внедрите интерфейс в свою активность, затем передайте ‘this’ в конструктор адаптера, чтобы установить прослушиватель.