【问题标题】:Modify LiveData item fetched from Room修改从 Room 获取的 LiveData 项
【发布时间】:2019-04-04 16:02:25
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

更新实时数据集中的值不会更新底层源。我建议将您的 DAO 更新到当用户单击 LIKE 按钮时,它会更新 DB..然后再将更新发布到您的 livedata 并且更改将反映在视图上。

例如:

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

还要注意,您不需要将 Application 传递给适配器。在适配器中设置一个接口,告诉 Activity 用户按下了收藏按钮。

在适配器中:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多