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