Android - notifyDataSetChanged()不起作用

时间:2013-08-03 13:42:58

标签: java android android-arrayadapter

我创建了一个显示问题列表的自定义ArrayAdapter。我查询数据库,转换该数据,将数据传递给数组,然后将数组传递给ArrayAdapter以显示我的列表。

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

在我的应用中,您可以点击各种问题,操纵一些内容并返回主列表。底层数组尚未更改,因为更改已在db中保留。我再次查询数据库,运行我的转换,然后我的数组是最新的。我在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();
}

我需要做些什么来完成这项工作?谢谢你的帮助。

1 个答案:

答案 0 :(得分: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();
}