Android系统。 notifyDataSetChanged()方法和ListViews是如何工作的?

我想了解ListView概念,它是如何工作的,我试图创build我自己的适配器扩展BaseAdapter 。 对于ArrayAdapter实例,有一个notifyDataSetChanged()方法,应该在更新包含所有数据的数组列表之后调用,以刷新ListView

但是我创build了我自己的BaseAdapter的子类。 那种方法不适用于我,还是它? 我如何实现这个方法? 基本上,这个方法做了什么,也许我会理解。

ArrayAdapter情况下,我猜测它看着什么位置的ListView当前正在显示,并检查它是否与ArrayList更新后是否是相同的? 要么…

它说这个方法:

通知附加的观察者,底层数据已经被更改,任何反映数据集的视图都应该刷新自己。

但是它究竟如何刷新自己呢?

有人可以解释一下吗?

我已经知道了 。 我不明白接口是怎么开始的,怎么知道从哪里得到数据。 当我扩展BaseAdapter类,在该类的构造函数中,我初始化了我想在ListView看到的项目列表。 但我无法弄清楚这些价值是如何使用的。

所以这是事情!

BaseAdapter有一些需要重写的方法。 其中有getCount()

ListView被创build时,它调用getCount() 。 如果这返回一个不是0的值(我返回了之前在构造函数中初始化的ArrayList的大小),那么它会调用getView()足够的次数来填充项目的屏幕。 例如 ,我用20个项目初始化ArrayList 。 由于最初只有8个项目适合屏幕,所以getView()被调用了8次,每次都要求我返回的位置(更确切地说,它想知道该列在该特定位置上的样子,它需要包含什么数据)。 如果我向下滚动列表, getView()会一遍又一遍地被调用,直到我打到列表的最后,在我的例子中是20个项目/行。

notifyDataSetChanged()所做的是…当被调用时,它会查看在调用时屏幕上显示的项目(更确切地说是哪些行索引),并调用getView()与这些位置。

如果你正在显示列表中的前8个项目(所以那些是在屏幕上可见的),并且你在列表中的第二个和第三个项目之间添加另一个项目,并且调用notifyDataSetChanged()则调用getView() 8次,位置从0开始到7结束,因为在getView()方法中,你从ArrayList获取数据,那么它将自动返回列表中插入的新项目和前面的8(7而不是8,因为最后一个项目下降了一个位置,所以它不再可见), ListView将重绘,或任何与这些项目。

另外,需要注意的是,如果你已经正确地实现了getView() ,你将最终回收已经显示的项目(对象)(而不是创build新项目)。 在12:00左右看到这个video ,看看正确的方式来实现getView()

我已经通过在每种方法中调用LogCat并遵循所发生的事情来计算所有这些。

希望这可以帮助刚开始了解ListView的工作方式的人。

PS 这个例子也帮助我了解了很多。

BaseAdapter可以被其他类“观察”。 当你调用ListView setAdapter()方法时,它调用适配器的registerDataSetObserver 。 所以,适配器知道谁对新数据感兴趣。

你可以在这里查看BaseAdapter的来源。 这很小。

notifyDataSetChanged 可用的,你基本上不应该重写它(因为它没有做任何特殊的事情,所以你可以重用它在你自己的类)。

假设你的ListView显示存储在ArrayList中的一些数据。

在更改ArrayList的内容之后,您需要告诉列表数据源已更改,并且需要重新绘制以显示新数据。

所以,那就是notifyDatasetChanged()进来的地方。它告诉ListView数据已经被修改了。 并显示新的数据, ListView必须重绘。

由于您正在为创build子类而自己扩展BaseAdapter ,因此还会获得notifyDataSetChanged()方法。