Android LiveData列表未更新

时间:2018-02-05 05:36:15

标签: android android-room android-livedata

我正在使用Android LiveData和Room Database来更新列表。

我有一个注释列表,其中有一个勾号将其标记为“完成”。

如果它们被标记为已完成,我将它们从当前列表中删除(而不是从数据库中删除),以便它们可以显示在另一页上。

但是标记完成后不会更新我的列表。

DAO:

    @Dao
public interface NoteDao {
    @Query("SELECT * FROM notes WHERE isDone=0")
    LiveData<List<Note>> getAll();

    @Insert
    void insert(Note note);

    @Delete
    void delete(Note note);

    @Update
    void update(Note note);

}

我的适配器中有一个onchecked侦听器,用于处理列表单击。

 Note note = allNotes.get(position);
 holder.mCheckBox.setListener(isChecked -> {
             note.setIsDone(1);
             mNoteDao.update(note);
             notifyDataSetChanged();
        });

我已将一个观察功能放入活动中。

mNoteDao.getAll().observe(this, notes -> {
            if (notes != null && notes.size() > 0) {
                img_no_notes.setVisibility(View.GONE);
                txt_no_notes.setVisibility(View.GONE);
                Collections.reverse(notes);
                mAdapter.setItems(notes);
            } else {
                img_no_notes.setVisibility(View.VISIBLE);
                txt_no_notes.setVisibility(View.VISIBLE);
            }
        });

列表会在重新启动时更新。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您的LiveData仅负责对Room数据库更改做出反应。如果要更改列表,则需要创建单独的列表或实时数据副本。总体而言,这是一种不好的做法,LiveData + Room仅用于数据库更改,而不用于内存实例。想象一下您的LiveData对象就像包装Room数据库一样。

答案 1 :(得分:0)

您的笔记可能不会自行更新,因为您的活动未更改状态。在这种情况下,您应该在复选框监听器中更新已更改笔记的UI

来自文档:

LiveData接收观察者并仅在数据更改处于STARTED或RESUMED状态时通知它。