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
东西。我只是想知道为什么有时候它似乎没有重新查询光标。但这种情况真的很少发生,我很少忘记这个问题,直到我从另一个角度看到它,从那时起就再也没有发生过。也许我应该忘记它,直到它成为一个真正的问题。