方法 adapter.notifyDataSetInvalidated() 完成了什么?没有关于它的文档。
我正在尝试重新加载 ListView 和 notifyDataSetChanged 或 notifyDataSetInvalidated 似乎没有完成任何事情。
方法 adapter.notifyDataSetInvalidated() 完成了什么?没有关于它的文档。
我正在尝试重新加载 ListView 和 notifyDataSetChanged 或 notifyDataSetInvalidated 似乎没有完成任何事情。
据我所知,该notifyDataSetInvalidated()
方法会阻止适配器访问数据(以防它无效、不可用等)。该notifyDataSetChanged()
方法会更新,ListView
因此您可以看到添加的新数据,但您必须在 UI 线程中调用它。
观看这个视频对我有很大帮助——有两个部分提到了这些方法并解释了如何正确使用它们。也许它也可以帮助你:)
这取决于适配器的实现......如果您查看源代码,您会看到:
notifyDataSetInvalidated()
调用notifyInvalidated()
类的DataSetObservable
(见这里)notifyInvalidated()
调用onInvalidated()
方法DataSetObserver
(参见此处)。onInvalidated()
什么都不做......这是它的实现:
public void onInvalidated() {
// Do nothing
}
DataSetObserver
是一个抽象类,所以由子类决定在onInvalidated()
.
我最近遇到了这个问题,并想为那些想知道当你调用notifyDataSetChanged()
and时发生了什么的人详细说明notifyDataSetInvalidated()
。*简短回答,到这里
正如@Cristian 在他的回答中所说,当您在适配器上调用这些通知方法时,它基本上通过几个类调用并最终在您的适配器注册的 s上调用onChanged()
/ 。onInvalidated()
DataSetObserver
如果您遵循代码,您确实会看到它DataSetObserver
是抽象的,并且onChanged()
/onInvalidated()
方法是空的,等待子类实现。
如果这就是故事的结局,那么为什么 Android 框架工程师一直告诉我们如果他们什么都不做就调用这些方法呢?它进行了一些挖掘,但事实证明已经有一个 this 的子类,DataSetObserver
并且AdapterDataSetObserver
它存在于抽象类AdapterView
中(由GridView
和等类扩展ListView
)。setAdapter()
当您在您的适配器上注册AdapterView
并注册到您的适配器时,Android 会自动创建此观察者。
在这里,您可以看到这些方法实际上所做的所有疯狂的事情。文档很差,起初我以为我需要注册自己的子类DataSetObserver
来获得这些功能,但事实证明已经为你创建了一个。
*我认为可能有用的东西:我相信您可以向您的适配器注册多个DataSetObserver
(除了默认的)。如果需要,这将允许您做一些额外的工作(例如,当位图下载完成时,可能将进度条视图与图像视图交换)。
根据“ listView 的世界”讲座,每次 listView 没有可显示的内容(即空数据)时,您都应该使用它。
他们谈论的一个例子是过滤完成时(在“publishResults”方法上)。在讲座视频上,时间是 36:00。
奇怪的是,他们为什么不直接将它与 notifyDataSetChanged 合并,它可以检查项目的数量并决定自己调用它......
据我所见,讲座上讲的不太对。如果适配器之前显示了一些内容,现在它什么都不包含,现在你调用notifyDataSetInvalidated,什么都不会发生,所以内容会保留,所以我认为只有在数据没有变化时才使用notifyDataSetInvalidated是安全的.
例如,如果您处理过滤,并且您得到与以前相同的结果(也许检查结果数量就足够了),您可以调用 notifyDataSetInvalidated 而不是 notifyDataSetChanged