为什么由自定义CursorAdapter管理的ListView会自动刷新新数据?

时间:2012-02-23 15:20:18

标签: android listactivity android-cursoradapter

我的应用程序上有这个“问题”,我总是困扰我,我不理解它的行为,但从来不关心问为什么,直到现在。

我有ListView(通过ListActivity实施),每个列表项都有自定义布局。有了这个我有一个自定义CursorAdapter来正确填充所有列表项元素(覆盖newViewbindView,ViewHolder模式在这样做时已经得到保证,请参阅:{{ 3}}如果需要的话。)

这是主要活动,有2个操作可以更新ListView的内容,创建新项目或编辑当前项目。对于两者,使用相同的活动(它适应行动的类型),如下所示:

startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_CREATE);
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_EDIT);

实际区分动作类型的是意图内容,子活动中忽略requestCode

现在,文档中有关于上述方法的说法:

  

当此活动退出时,您的onActivityResult()方法将是   使用给定的requestCode调用。

但我没有使用onActivityResult。实际上,当子活动存在时(在创建或编辑模式下),我没有做任何事情。到目前为止我注意到的行为是:

  • 创建:几乎所有时间我都会返回主要活动,ListView会自动使用新项目进行更新。但是,有时候很少会在ListView中填充新项目。我需要销毁主要活动(例如退出应用程序)并重新创建它,然后新项目将在那里。
  • 编辑:我从未注意到刚刚为创建操作所描述的类似行为。到目前为止,ListView始终会根据新的内容更改自动更新。

我的问题是,当我从未调用ListView或手动通知内容的任何更改时,我的cursor.requery()会自动更新内容的幕后发生了什么?为什么地狱不能一直运作?

我是否可以cursor.requery()强迫onActivityResult {/ 1}}。

public class MainActivity extends ListActivity {

    private static final int ACTIVITY_NOTE_EDITOR_CREATE = 0;

    private NotificationHelper mNotificationHelper;
    private AgendaNotesAdapter mAgendaAdapter;
    private Cursor mAllNotesCursor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mNotificationHelper = Program.getNotificationHelper();

        mAgendaAdapter = new AgendaNotesAdapter(this);
        mAgendaAdapter.open();

        initializeNotesListActivity();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent intent;

        switch(item.getItemId()) {
            case R.id.actionbar_item_new_note:
                intent = NoteEditorMainActivity.createIntent(this);
                startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_CREATE);
                return true;
        }

        return false;
    }

    private void initializeNotesListActivity() {
        mAllNotesCursor = mAgendaAdapter.fetchAllNotes();
        startManagingCursor(mAllNotesCursor);

        NotesListAdapter notesAdapter = new NotesListAdapter(this, mAllNotesCursor,
                mNotificationHelper, mAgendaAdapter);

        setListAdapter(notesAdapter);
    }

}

P.S:我知道CursorLoader,这是路线图中的内容,但我暂时还没有时间处理这些代码重写。我想我会告诉你的。现在,我只需要知道当前代码发生了什么。

1 个答案:

答案 0 :(得分:1)

您对startManagingCursor()的来电意味着当活动停止时,Cursor将停用,重新启动活动后,系统会重新Cursor

  

我是否可以在onActivityResult上强制使用cursor.requery()?

这应该会自动发生在您的托管Cursor