方法adapter.notifyDataSetInvalidated()实现了什么功能?目前没有相关的文档。
我正在尝试重新加载ListView,但notifyDataSetChanged或notifyDataSetInvalidated似乎都没有起到任何作用。
方法adapter.notifyDataSetInvalidated()实现了什么功能?目前没有相关的文档。
我正在尝试重新加载ListView,但notifyDataSetChanged或notifyDataSetInvalidated似乎都没有起到任何作用。
notifyDataSetInvalidated()
方法会停止适配器访问数据(如果数据无效、不可用等)。notifyDataSetChanged()
方法更新 ListView
,以便您可以看到添加的新数据,但是必须在UI线程中调用它。这取决于适配器的实现方式...如果你查看源代码,你会看到:
notifyDataSetInvalidated()
调用了 DataSetObservable
类的 notifyInvalidated()
方法 (见这里)notifyInvalidated()
为每个 DataSetObserver
调用了 onInvalidated()
方法 (见这里)。onInvalidated()
什么都不做...以下是它的具体实现:
public void onInvalidated() {
// Do nothing
}
DataSetObserver
是一个抽象类,因此由子类决定在 onInvalidated()
上该做什么。
notifyDataSetChanged()
而不是invalidated - changed,因为后者会导致适配器重新绘制自身。 - karl我最近遇到了这个问题,想要为那些想从编程角度了解在调用 notifyDataSetChanged()
和 notifyDataSetInvalidated()
时发生了什么的人详细说明一下。 *简短的答案,请点击 这里
正如 @Cristian 在他的答案中所述,当您在 Adapter 上调用这些 notify 方法时,它基本上会通过几个类进行调用,并最终调用已注册的 DataSetObserver 的 onChanged()
/onInvalidated()
。
如果您跟随代码,您确实会看到 DataSetObserver
是抽象的,正如所述,onChanged()
/onInvalidated()
方法是空的,等待子类实现。
AdapterDataSetObserver
的子类继承了这个DataSetObserver
,并且它属于抽象类AdapterView
(被GridView
和ListView
等类继承)。当你在AdapterView
上setAdapter()
时,Android会自动创建这个观察器并将其registered到你的适配器中。DataSetObserver
才能使它们正常工作,但事实证明,已经有一个为你创建好的观察器了。
我认为下面的建议可能会有所帮助:我相信您可以向Adapter注册多个DataSetObserver
(除了默认的一个以外)。这样做可以在必要时执行一些额外的工作(例如,当位图下载完成时,可能会将进度条视图与图像视图交换)。