Android - adapter.notifyDataSetInvalidated有什么作用?

Taw*_*ani 29 android dataadapter

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

我试图重新加载ListView和notifyDataSetChanged或notifyDataSetInvalidated似乎没有完成任何事情.

luc*_*idd 28

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

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


Cri*_*ian 27

这取决于适配器实现...如果你看一下源代码,你会看到:

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

这是它的实现:

public void onInvalidated() {
    // Do nothing
}
Run Code Online (Sandbox Code Playgroud)

DataSetObserver是一个抽象类,因此由子类决定要做什么onInvalidated().


Ton*_*han 18

我最近就遇到了这个问题,并希望制定为那些谁知道编程,当你调用发生了什么notifyDataSetChanged()notifyDataSetInvalidated().*简短的回答,请到这里

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

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

如果这是故事的结尾,那么为什么Android框架工程师会告诉我们如果他们什么也不做就会调用这些方法?它需要一些挖掘,但事实证明已经有一个DataSetObserver被调用的子类,AdapterDataSetObserver它存在于抽象类中AdapterView(由类GridView和它扩展ListView).这名观察员将自动由Android,当你创建setAdapter()你的AdapterView和被注册到你的适配器.

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

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