Android - adapter.notifyDataSetInvalidated是做什么用的?

29

方法adapter.notifyDataSetInvalidated()实现了什么功能?目前没有相关的文档。

我正在尝试重新加载ListView,但notifyDataSetChanged或notifyDataSetInvalidated似乎都没有起到任何作用。

4个回答

28
据我所知,notifyDataSetInvalidated() 方法会停止适配器访问数据(如果数据无效、不可用等)。notifyDataSetChanged() 方法更新 ListView,以便您可以看到添加的新数据,但是必须在UI线程中调用它。
我觉得有帮助的是观看这个视频——其中有两个部分提到了这些方法,并解释了如何正确使用它们。也许对您也有帮助 :)


26

这取决于适配器的实现方式...如果你查看源代码,你会看到:

  1. notifyDataSetInvalidated() 调用了 DataSetObservable 类的 notifyInvalidated() 方法 (见这里)
  2. 然后,notifyInvalidated() 为每个 DataSetObserver 调用了 onInvalidated() 方法 (见这里)。
  3. 接下来是有趣的部分:onInvalidated() 什么都不做...

以下是它的具体实现:

public void onInvalidated() {
    // Do nothing
}

DataSetObserver是一个抽象类,因此由子类决定在 onInvalidated() 上该做什么。


请注意,您几乎总是希望调用notifyDataSetChanged()而不是invalidated - changed,因为后者会导致适配器重新绘制自身。 - karl

20

我最近遇到了这个问题,想要为那些想从编程角度了解在调用 notifyDataSetChanged()notifyDataSetInvalidated() 时发生了什么的人详细说明一下。 *简短的答案,请点击 这里

正如 @Cristian 在他的答案中所述,当您在 Adapter 上调用这些 notify 方法时,它基本上会通过几个类进行调用,并最终调用已注册的 DataSetObserver 的 onChanged()/onInvalidated()

如果您跟随代码,您确实会看到 DataSetObserver 是抽象的,正如所述,onChanged()/onInvalidated() 方法是空的,等待子类实现。

如果这是故事的结尾,那么为什么Android框架工程师会告诉我们调用这些方法,而它们却什么都不做呢?经过一番挖掘,发现已经有一个名为AdapterDataSetObserver的子类继承了这个DataSetObserver,并且它属于抽象类AdapterView(被GridViewListView等类继承)。当你在AdapterViewsetAdapter()时,Android会自动创建这个观察器并将其registered到你的适配器中。
就是在这里,你可以看到所有这些疯狂方法实际上所做的事情。文档不太好,起初我以为需要注册自己子类的DataSetObserver才能使它们正常工作,但事实证明,已经有一个为你创建好的观察器了。

我认为下面的建议可能会有所帮助:我相信您可以向Adapter注册多个DataSetObserver(除了默认的一个以外)。这样做可以在必要时执行一些额外的工作(例如,当位图下载完成时,可能会将进度条视图与图像视图交换)。


3
根据 "listView的世界" 讲座,当listView没有内容可显示(即空数据)时,您应该使用它。
他们谈到的一个例子是当过滤完成时(在“publishResults”方法上)。在讲座视频中,它在36:00处。
奇怪的是,为什么他们不把它与notifyDataSetChanged合并,后者可以检查项目数量并决定自己调用它...
根据我所见,在讲座中所说的并不完全正确。如果适配器之前显示了一些内容,现在它不包含任何内容,并且现在您调用notifyDataSetInvalidated,那么什么都不会发生,因此内容将保留,因此我认为只有在数据不改变时才使用notifyDataSetInvalidated是安全的。
例如,如果您处理过滤,并获得了与之前相同的结果(也许只需检查结果数量),则可以调用notifyDataSetInvalidated而不是notifyDataSetChanged。

如果你得到了相同的结果,就像你最后一段所说的那样,你不需要做任何事情,因为数据与之前相同 :p - HendraWD
@HendraWijayaDjiono 这就是我写的内容。我觉得这很奇怪,因为我看不出来它有什么用处。我找不到一个好的应用场景。 - android developer

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