【问题标题】:Can't get newest data from DAO unless restart the app除非重新启动应用程序,否则无法从 DAO 获取最新数据
【发布时间】:2020-06-22 10:58:21
【问题描述】:

我有一个项目,它是一个简单的备忘录应用程序。我在RecyclerView 中显示最新数据时遇到问题。每次用户添加新备忘录时,我都必须重新启动应用程序才能看到新的更改。我该如何解决?

MainActivity(RecyclerView 所在的位置)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRepository = new MemoRepository(this);

    initRecyclerView();
    insertDummyData();
}


private void initRecyclerView(){
    mRecyclerView = findViewById(R.id.recyclerView);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mMemoAdapter = new MemoAdapter(mNotes, this);

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mMemoAdapter);
}


private void insertDummyData(){
    mRepository.getAllMemos().observe(this, new Observer<List<Note>>() {
        @Override
        public void onChanged(List<Note> notes) {
            if (mNotes.size() > 0){
                notes.clear();
            }
            if (notes != null){
                mNotes.addAll(notes);
            }
            mMemoAdapter.notifyDataSetChanged();
        }
    });

}

存储库

public class MemoRepository  {

    private MemoDatabase mDatabase;

    public MemoRepository (Context context){
        this.mDatabase = MemoDatabase.getDatabase(context);
    }

    public void insertNewMemo(Note note){
        new InsertMemoAsyncTask(mDatabase.memoInterface()).execute(note);
    }

    public LiveData<List<Note>> getAllMemos(){
       return mDatabase.memoInterface().getAllMemos();
    }
}

道接口

@Dao
public interface MemoInterface {
    @Insert
    void insertMemo(Note... note);

    @Query("SELECT * FROM note")
    LiveData<List<Note>> getAllMemos();
}

用户输入备忘录内容的活动

@Override
public void onClick(View v) {
    switch (v.getId()) {

        case R.id.save_memo: {
            //test
            mNote.setTitle(editTitle.getText().toString());
            mNote.setContent(content.getText().toString());
            mNote.setTimestamp("00 0000");
            mRepository.insertNewMemo(mNote);
            finish();
            break;
        }
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

    你可以这样做:

    MemoAdapter类中,添加一个方法:

    public void setViewItems(List<Note> viewItems) {
        this.viewItems = viewItems
        notifyDataSetChanged()
    }
    

    并更新以下方法:

    private void insertDummyData(){
        mRepository.getAllMemos().observe(this, new Observer<List<Note>>() {
            @Override
            public void onChanged(List<Note> notes) {
                if (mNotes.size() > 0){
                    notes.clear();
                }
                if (notes != null){
                    mNotes.addAll(notes);
                }
                mMemoAdapter.setViewItems(mNotes);
            }
        });
    
    }
    

    【讨论】:

    • 这根本没有帮助。顺便提一句。您必须将该方法公开^^
    • 你能解释一下你是如何实现的吗?您正在将备忘录保存在其他活动中吗?并且当您移至列表活动时,不会显示新添加的项目,并且一旦重新启动应用程序,就会显示新添加的项目。对吗?
    • 如果是这种情况,那么我建议从onResume 方法而不是从onCreate() 调用insertDummyData();
    • 对上面的评论加一。当列表视图需要刷新时,您应该始终在 onResume 而不是 onCreate 中进行。这样,如果您进入一个新对话框,例如添加一条记录,然后返回列表视图,onResume 将被调用并重新填充列表。
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多