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

A_P*_*ine 6 android android-arrayadapter android-listview

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

我有一个数组适配器(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();

}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

ps正在清除数据库.

rog*_*oom 12

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

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

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

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

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

所以虽然我无法解释为什么in notifiyDataSetChanged不能在你的onClick方法中专门工作.我希望提供有用的信息,可以帮助您使应用程序按预期工作.

  • 我同意,什么是牛肉!我甚至不再使用特定的"文档化功能",因为我无法保证它们始终可以工作(即使提供了文档).事实上,我之前遇到过豪猪的问题,我甚至不再使用notifydatachanged()了.:(我只是制作自己的事件处理程序.真的很难过.**这个评论专门针对Android适配器,而不是整个SDK** (2认同)

bli*_*uff 9

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