修改从房间获取的LiveData项目

时间:2019-04-04 16:02:26

标签: android android-recyclerview android-room android-livedata

我有一个简单的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列即可。谢谢。

1 个答案:

答案 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”传递到适配器的构造函数中以设置侦听器。