0

我在我的应用程序上遇到过这个“问题”有一段时间了,我一直困扰着我不理解它的行为,但直到现在才关心问为什么。

我有一个ListView(通过 a 实现ListActivity),每个列表项都有一个自定义布局。有了这个我有一个自定义CursorAdapter来正确填充所有列表项元素(覆盖newViewbindView,ViewHolder 模式在这样做时已经得到保证,如果需要,请参阅:https ://codereview.stackexchange.com/q/1057 )。

这是主要活动,有 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吗?

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

}

PS:我知道 CursorLoader 并且它在路线图中,但我暂时没有时间处理此类代码重写。只是想我会让你知道。现在,我只需要知道我当前的代码发生了什么。

4

1 回答 1

1

您的调用startManagingCursor()意味着当活动停止时,将Cursor停用,当活动重新启动时,将Cursor重新查询。

我应该自己在 onActivityResult 上强制使用 cursor.requery() 吗?

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

于 2012-02-23T16:25:12.003 回答