2012-02-23 64 views
0

我有一段時間在我的應用程序中遇到過這個「問題」,它總是困擾我,我不明白它的行爲,但從來沒有關心爲什麼,直到現在。爲什麼由自定義CursorAdapter管理的ListView會自動刷新新數據?

我有一個ListView(通過ListActivity實施)與每個列表項的自定義佈局。因此,我有一個自定義的CursorAdapter來正確填充所有列表項元素(覆蓋newViewbindView,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它的東西的路線圖,但我沒有時間來處理這樣的代碼重寫暫且。只是想我會讓你知道的。現在,我只需要知道當前代碼發生了什麼。

+0

發佈您的主'ListActivity'或至少'onCreate'方法的代碼。 – Luksprog 2012-02-23 16:02:24

+0

更新了相關代碼的問題。 – 2012-02-23 16:21:07

+0

不值得發佈爲答案,但也許你可以在onActivityResult()中調用initializeNotesListAdapter()類。它不會作爲最終解決方案(它重置ListView的位置,這可能會讓用戶惱火),它至少可以幫助您查看列表是否在此實例中添加新項目。 – JMRboosties 2012-02-23 16:29:18

回答

1

您致電startManagingCursor()意味着當活動停止時,Cursor被停用,並且當活動重新啓動時,Cursor被重新查詢。

我應該強制一個cursor.requery()我onActivityResult?

這應該會自動發生在您的管理Cursor

+0

我知道我錯過了像'startManagingCursor'這樣的東西。我只是想知道爲什麼有時它似乎沒有重新查詢光標。但實際上很少發生,很少發生,直到我以其他方式看到它之後,我才忘記了這個問題,從那時起,它再也沒有發生過。也許我應該忘記它,直到它成爲一個真正的問題。 – 2012-02-23 16:44:33

相關問題