方法 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