我在我的应用程序上遇到过这个“问题”有一段时间了,我一直困扰着我不理解它的行为,但直到现在才关心问为什么。
我有一个ListView
(通过 a 实现ListActivity
),每个列表项都有一个自定义布局。有了这个我有一个自定义CursorAdapter
来正确填充所有列表项元素(覆盖newView
和bindView
,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 并且它在路线图中,但我暂时没有时间处理此类代码重写。只是想我会让你知道。现在,我只需要知道我当前的代码发生了什么。