我有一个简单的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
不是一个好主意。
有什么主意吗?我只需要在Book实体中设置一个简单的boolean
列即可。谢谢。
答案 0 :(得分:1)
更新实时数据集中的值不会更新基础源。我建议将您的DAO更新到用户单击“ LIKE”按钮时的位置,它会更新DB..DB,然后将更新发布到您的livedata中,更改将反映在视图上。
例如:
@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”传递到适配器的构造函数中以设置侦听器。