数组适配器notifyDataSetChanged()将不起作用

时间:2012-01-10 17:36:40

标签: android android-listview android-arrayadapter

我在这个上浪费了太多时间,所以不得不再问一次。我不知道为什么会发生这种情况。

我有一个数组适配器(aAdapter)和一个数组列表(aList),我试图用一个清除按钮来清除数据库中的条目并清除列表。

我的问题是NotifyDataSetChanged()在我的onlick方法中不起作用:

public void clearDB(View view) {
    aList.clear();
    aAdapter.notifyDataSetChanged();
    HighScoresDB hsdb = new HighScoresDB(HighScoresActivity.this);
    hsdb.openDB();
    hsdb.clearDB();
    hsdb.closeDB();

}

它适用于其他任何地方。我甚至尝试将clear和notifyDataSetChanged()放在另一个方法中并调用它,但这不起作用,但是当我从onCreate调用它时它确实有效....

有什么想法吗?

P.S。数据库正在被清除。

5 个答案:

答案 0 :(得分:12)

首先,我发现Android适配器实现存在很大缺陷。当谈到执行任何定制时,似乎有关于如何使用它的模糊描述,官方文档没有澄清其中任何一个。我很高兴被证明是错误的。

在视图中编辑数据时,我获得一致结果的方式如下:

  • 所呈现的基础数据结构的所有更改都应该在AsyncTask中完成,这在您更改UI线程上的内容并且不希望出现并发问题时是有意义的。

  • 底层数据结构的操作应该通过调用适配器方法来执行,所以如果你有ListAdapter,那么你可以使用addremoveclear列表适配器。这意味着适配器管理视图通知等。这通常导致必须创建自定义适配器,因为可用的方法是有限的(在7之前甚至没有添加所有sdk版本)。你也最终将你的适配器作为一个大的fat controller,虽然我知道我们不应该将android视为MVC模式,但它似乎仍然是错误的。

  • 我已经创建了应用程序,我绕过适配器调用来操作底层数据结构,并且它已经完成所有结果,最终变得不可预测,除非您严格管理通知到视图。现在我只需通过适配器调用。

所以虽然我无法解释为什么notifiyDataSetChangedonClick方法中不起作用。我希望提供有用的信息,可以帮助您使应用程序按预期工作。

答案 1 :(得分:9)

虽然不漂亮,但您可以重新初始化适配器而不是通知它,我已经看到有时它是使其工作的唯一方法。

答案 2 :(得分:2)

所以我处理类似问题的方法是基本上重新初始化适配器,就像blindstuff说的那样。

    public class Example extends Activity{
        CustomAdapter adapter;
        ArrayList<ArrayList<String>> info = new ArrayList<ArrayList<String>>();
        final ListView list = (ListView) findViewById(R.id.listView_custom);
        adapter = new CustomAdapter(this, diceInfo.get(id));
        list.setAdapter(adapter);

然后在onclick Listener

add.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                info.get(id).add("1,0,0,true");
                adapter = new CustomAdapter(Example.this, info.get(id));
                list.setAdapter(adapter);
            }
        });

该示例没有初始化所有内容,但它已经达到了目的。我只是创建一个新的适配器并将其设置为我的列表视图。效果很好。

答案 3 :(得分:0)

当在对话框中使用时,还遇到了适配器的奇怪行为。 一旦适配器更新(或底层结构 - 两种方式)和notifiyDataSetChanged对话框消失,没有错误或LogCat中的其他跟踪或Eclipse的调试。 完全相同的代码,一旦适配器应用于正常活动(ListView)就可以正常工作。

答案 4 :(得分:0)

我想这个帖子已经不再活跃了,但是为了将来参考:

根据developer.android.com

  

[onNotifyDataSetChanged()]通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。

不要让Adapter告诉View刷新自己,只需使用adapter.clear()和adapter.add()更新数据,然后通过再次调用listView.setAdapter(adapter)强制ListView更新。 p>