我有简单的RecyclerView
,我用LiveData
填充。
活动:
viewModel.getBooks().observe(this, books -> booksAdapter.setBooks(books));
视图模型:
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
。一个(不好的)解决方案是将Application发送到适配器,在那里我将创建存储库并“手动”更新Book实体。但我知道将Application
送到adapter
不是一个好主意。
知道如何制作这个吗?我只需要在Book实体中设置一个简单的boolean
列。谢谢。
更新livingata集中的值不会更新基础源。我建议将DAO更新到用户单击LIKE按钮的位置,它会更新DB..which然后将更新发布到您的livingata,更改将反映在视图上。
例如:
@Query("UPDATE books SET FAVOURITE = :value WHERE books.bookId = :bookId")
public abstract void setBookFavourited(boolean value, int bookId);
另外需要注意的是,您不需要将Application传递给适配器。在适配器中设置一个接口,告诉活动用户按下了收藏夹按钮。
适配器:
public interface BookFavoriteListener {
void onBookFavorited(Book book);
}
在您的活动中实现接口,然后将“this”传递给适配器的构造函数以设置监听器。