28

方法 adapter.notifyDataSetInvalidated() 完成了什么?没有关于它的文档。

我正在尝试重新加载 ListView 和 notifyDataSetChanged 或 notifyDataSetInvalidated 似乎没有完成任何事情。

4

4 回答 4

28

据我所知,该notifyDataSetInvalidated()方法会阻止适配器访问数据(以防它无效、不可用等)。该notifyDataSetChanged()方法会更新,ListView因此您可以看到添加的新数据,但您必须在 UI 线程中调用它。

观看这个视频对我有很大帮助——有两个部分提到了这些方法并解释了如何正确使用它们。也许它也可以帮助你:)

于 2010-07-10T15:50:57.613 回答
27

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

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

这是它的实现:

public void onInvalidated() {
    // Do nothing
}

DataSetObserver是一个抽象类,所以由子类决定在onInvalidated().

于 2010-07-10T15:40:22.667 回答
19

我最近遇到了这个问题,并想为那些想知道当你调用notifyDataSetChanged()and时发生了什么的人详细说明notifyDataSetInvalidated()。*简短回答,到这里

正如@Cristian 在他的回答中所说,当您在适配器上调用这些通知方法时,它基本上通过几个类调用并最终在您的适配器注册的 s上调用onChanged()/ 。onInvalidated()DataSetObserver

如果您遵循代码,您确实会看到它DataSetObserver是抽象的,并且onChanged()/onInvalidated()方法是空的,等待子类实现。

如果这就是故事的结局,那么为什么 Android 框架工程师一直告诉我们如果他们什么都不做就调用这些方法呢?它进行了一些挖掘,但事实证明已经有一个 this 的子类,DataSetObserver并且AdapterDataSetObserver它存在于抽象类AdapterView中(由GridView和等类扩展ListView)。setAdapter()当您在您的适配器上注册AdapterView注册到您的适配器时,Android 会自动创建此观察者。

在这里,您可以看到这些方法实际上所做的所有疯狂的事情。文档很差,起初我以为我需要注册自己的子类DataSetObserver来获得这些功能,但事实证明已经为你创建了一个。

*我认为可能有用的东西:我相信您可以向您的适配器注册多个DataSetObserver(除了默认的)。如果需要,这将允许您做一些额外的工作(例如,当位图下载完成时,可能将进度条视图与图像视图交换)。

于 2011-10-12T00:27:02.990 回答
3

根据“ listView 的世界”讲座,每次 listView 没有可显示的内容(即空数据)时,您都应该使用它。

他们谈论的一个例子是过滤完成时(在“publishResults”方法上)。在讲座视频上,时间是 36:00。

奇怪的是,他们为什么不直接将它与 notifyDataSetChanged 合并,它可以检查项目的数量并决定自己调用它......

据我所见,讲座上讲的不太对。如果适配器之前显示了一些内容,现在它什么都不包含,现在你调用notifyDataSetInvalidated,什么都不会发生,所以内容会保留,所以我认为只有在数据没有变化时才使用notifyDataSetInvalidated是安全的.

例如,如果您处理过滤,并且您得到与以前相同的结果(也许检查结果数量就足够了),您可以调用 notifyDataSetInvalidated 而不是 notifyDataSetChanged

于 2014-03-22T20:34:04.060 回答