#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’ в конструктор адаптера, чтобы установить прослушиватель.