修改从 Room 获取的 LiveData 项目

Modify LiveData item fetched from Room

我有简单的 RecyclerView,我用 LiveData.

填充

Activity:

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。 一种(不好的)解决方案是将应用程序发送到适配器,我将在其中创建存储库并更新 Book 实体 "manually"。但我知道将 Application 发送到 adapter 不是一个好主意。

知道怎么做吗?我只需要在 Book 实体中设置一个简单的 boolean 列。谢谢。

更新实时数据集中的值不会更新基础源。我建议将您的 DAO 更新到用户单击 LIKE 按钮时的位置,它会更新数据库..然后 post 更新您的实时数据,并且更改将反映在视图中。

例如:

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

还要注意,您不需要将应用程序传递给适配器。在适配器中设置一个界面,告诉 activity 用户按下了收藏夹按钮。

在适配器中:

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

在您的 activity 中实现接口,然后将 'this' 传递给适配器的构造函数以设置侦听器。