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()
方法。