2013-08-03 208 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

相关问题