Android - notifyDataSetChanged()不起作用

4

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

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();
}

我需要做什么才能使它工作?感谢您的帮助。
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接