Android 为什么自定义游标或适配器管理的ListView会自动刷新新数据?

Android 为什么自定义游标或适配器管理的ListView会自动刷新新数据?,android,listactivity,android-cursoradapter,Android,Listactivity,Android Cursoradapter,我在我的应用程序上遇到这个“问题”已经有一段时间了,它一直困扰着我,我不理解它的行为,但直到现在我才关心为什么 我有一个ListView(通过ListActivity实现),每个列表项都有一个自定义布局。有了它,我就有了一个自定义的CursorAdapter,可以正确地填充所有列表项元素(覆盖newView和bindView,这样做时已经保证了ViewHolder模式,请参阅:如果需要) 这是主要活动,有两个操作可以更新列表视图的内容、创建新项目或编辑当前项目。对于这两种情况,使用相同的活动(根

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

我有一个
ListView
(通过
ListActivity
实现),每个列表项都有一个自定义布局。有了它,我就有了一个自定义的
CursorAdapter
,可以正确地填充所有列表项元素(覆盖
newView
bindView
,这样做时已经保证了ViewHolder模式,请参阅:如果需要)

这是主要活动,有两个操作可以更新
列表视图的内容、创建新项目或编辑当前项目。对于这两种情况,使用相同的活动(根据动作类型进行调整),如下所示:

startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_CREATE);
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_EDIT);
实际区分动作类型的是意图内容,
requestCode
在子活动中被忽略

现在,文档中对上述方法有如下说明:

当此活动退出时,onActivityResult()方法将被禁用 使用给定的请求代码调用

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

  • Create:几乎每次我返回主活动时,
    ListView
    都会自动用新项目更新。但是,有时,
    ListView
    中很少会填充新项。我需要销毁主要活动(例如退出应用程序)并重新创建,然后新项目就会出现
  • 编辑:我从未注意到与刚才描述的创建操作类似的行为。到目前为止,
    ListView
    总是随着新内容的更改而自动更新
我的问题是,当我从未调用
cursor.requery()
或手动通知内容的任何更改时,幕后发生了什么事情使我的
ListView
自动更新其内容?为什么它不能一直工作

我是否应该强制自己在ActivityResult上设置一个
游标.requery()

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

}

附言:我知道CursorLoader,它是路线图中的一部分,但我暂时没有时间处理这样的代码重写。我只是想让你知道。现在,我只需要知道当前代码发生了什么。

您对
开始管理游标()
的调用意味着当活动停止时,
游标将被停用,当活动重新启动时,
游标将被重新查询

我是否应该强制在onActivityResult上设置游标.requery()呢


对于托管的
光标

发布主
列表活动
的代码,或者至少发布
onCreate
方法,应该会自动发生这种情况。问题已用相关代码更新。不值得作为答案发布,但您可以在onActivityResult()中调用InitializeNodeListAdapter()类。它不会作为一个最终解决方案(它会重置ListView的位置,这可能会让用户感到恼火),它至少可以帮助您查看列表是否在此实例中添加了新项。@JMR问题是我没有办法测试,99%的时间新项都添加到列表中。正如我在下面的一条评论中所说,也许我应该忘记这个小问题,直到它成为一个真正的问题。我知道我遗漏了一些明显的东西,比如
startManagingCursor
东西。我只是想知道为什么有时候它似乎没有重新查询光标。但这种情况真的很少发生,我很少忘记这个问题,直到我从另一个角度看到它,从那时起就再也没有发生过。也许我应该忘记它,直到它成为一个真正的问题。