【问题标题】:Android LiveData List not updatingAndroid LiveData 列表未更新
【发布时间】:2018-02-05 05:36:14
【问题描述】:

我正在使用 Android LiveData 和房间数据库来更新列表。

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

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

但将它们标记为完成并不会更新我的列表。

道:

    @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);
            }
        });

列表在重新启动时更新。 感谢您的帮助。

【问题讨论】:

  • 能否请您展示 mAdapter 的 setItems() 方法?

标签: android android-room android-livedata


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    来自文档:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      相关资源
      最近更新 更多