我有一段時間在我的應用程序中遇到過這個「問題」,它總是困擾我,我不明白它的行爲,但從來沒有關心爲什麼,直到現在。爲什麼由自定義CursorAdapter管理的ListView會自動刷新新數據?
我有一個ListView
(通過ListActivity
實施)與每個列表項的自定義佈局。因此,我有一個自定義的CursorAdapter
來正確填充所有列表項元素(覆蓋newView
和bindView
,ViewHolder模式已經保證,如果需要,請參考:https://codereview.stackexchange.com/q/1057,如果需要的話)。
這是主要活動,有兩項操作可以更新ListView
的內容,創建新項目或編輯當前項目。在這兩方面,同樣的活動被使用(它本身適應行動的類型),像這樣:
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_CREATE);
startActivityForResult(intent, ACTIVITY_NOTE_EDITOR_EDIT);
究竟區分動作類型爲目的的內容,該requestCode
在子活動被忽略。現在
,文檔具有這樣說上面的方法:
當這個Activity退出,您的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);
}
}
P.S:我知道CursorLoader它的東西的路線圖,但我沒有時間來處理這樣的代碼重寫暫且。只是想我會讓你知道的。現在,我只需要知道當前代碼發生了什麼。
發佈您的主'ListActivity'或至少'onCreate'方法的代碼。 – Luksprog 2012-02-23 16:02:24
更新了相關代碼的問題。 – 2012-02-23 16:21:07
不值得發佈爲答案,但也許你可以在onActivityResult()中調用initializeNotesListAdapter()類。它不會作爲最終解決方案(它重置ListView的位置,這可能會讓用戶惱火),它至少可以幫助您查看列表是否在此實例中添加新項目。 – JMRboosties 2012-02-23 16:29:18