2013-08-03 460 views
4

我創建了一個顯示問題列表的自定義ArrayAdapter。我查詢數據庫,轉換數據,將數據傳遞給數組,然後將數組傳遞給ArrayAdapter以顯示我的列表。Android - notifyDataSetChanged()不起作用

dbData = getDbData(); 
List<Question> questions = getQuestions(1L); 
dbData.closeDb(); 
setContentView(R.layout.activity_questions); 
adapter = new QuestionsAdapter(this, getCurrentContext(), questions, 1L, dbData); 

在我的應用程序中,您可以點擊各種問題,操作一些東西並返回主列表。底層數組尚未更改,因爲更改已保存在數據庫中。我再次查詢數據庫,運行我的轉換,然後我的數組是最新的。我在onResume()方法中執行此操作,但適配器無法識別notifyDataSetChanged()方法的任何更改。我onResume()看起來是這樣的:

@Override 
protected void onResume() { 
    super.onResume(); 
    dbData = getDbData(); 
    questions = getQuestions(1L); 
    adapter = new QuestionsAdapter(this, getCurrentContext(), questions, 1L, dbData); 
    items.setAdapter(adapter); 
} 

我要查詢數據庫,使轉換,創建我的數組,然後創建一個新的適配器爲我的變化顯示主列表上。爲什麼我不能這樣做:

@Override 
protected void onResume() { 
    super.onResume(); 
    dbData = getDbData(); 
    questions = getQuestions(1L); 
    adapter.notifyDataSetChanges(); 
} 

我需要做些什麼才能做到這一點?謝謝您的幫助。

回答

15

的適配器保持所有元素的副本,所以當你調用notifyDataSetChanged,它會檢查自己的元素

的副本嘗試以下操作:

@Override 
protected void onResume() { 
    super.onResume(); 
    dbData = getDbData(); 
    questions = getQuestions(1L); 

    adapter.clear(); 
    adapter.addAll(questions); // API level [1..10] use for(..){ adapter.add(question.get(index)) } or simply implement addAll method in you custom adapter for your own convenience (thanks to @Mena) 
    adapter.notifyDataSetChanged(); 
} 
+5

+1這一點。注意:如果你想兼容API級別10-(如果內存服務),你不能使用'addAll'方法。你應該循環並使用'add'來代替。 – Mena

相關問題