我想通了。我无法理解适配器到底是如何启动的,以及它是如何知道从哪里获取数据的。当我扩展BaseAdapter
类时,在该类的构造函数中,我初始化了我想在ListView
. 但我无法弄清楚这些值将如何使用以及何时使用。
所以这就是事情!:
其中BaseAdapter
有一些方法需要被覆盖。其中,有getCount()
。
当ListView
创建和诸如此类时,它会调用getCount()
. 如果它返回一个不同于 0 的值(我返回了我之前在构造函数中初始化的 ArrayList 的大小),那么它会调用getView()
足够的时间来用项目填充屏幕。例如,我初始化了ArrayList
20 个项目。因为最初只有 8 个项目适合屏幕,所以getView()
被调用了 8 次,每次都要求我返回所需的位置(更准确地说,它想知道该行在该特定位置的列表中的样子,哪些数据它需要包含)。如果我向下滚动列表,getView()
会被一遍又一遍地调用,直到我到达列表的末尾,在我的情况下是 20 个项目/行。
什么notifyDataSetChanged()
是......当被调用时,它会查看调用时屏幕上显示的项目(更准确地说是哪些行索引)并getView()
使用这些位置进行调用。
即,如果您正在显示列表中的前 8 个项目(因此那些是屏幕上可见的项目)并且您在列表的第 2 和第 3 个项目之间添加另一个项目,然后您调用notifyDataSetChanged()
thengetView()
被调用 8 次,位置开始从 0 到 7 结束,并且因为在getView()
方法中您从 获取数据,ArrayList
它会自动返回插入到列表中的新项目以及前 8 个中的 7 个(7 而不是 8,因为最后一个项目去了一个位置向下,因此不再可见),并且ListView
将使用这些项目重绘或其他任何内容。
此外,需要说明的是,如果您已getView()
正确实施,您最终将回收已显示的项目(对象)(而不是创建新项目)。在 12:00 左右观看此视频以了解正确的实施方式getView()
LogCat
通过在每个方法中调用并跟踪正在发生的事情,我已经弄清楚了这一切。
希望这对刚刚开始了解ListView
s 工作原理的人有所帮助。
PS这个例子对我理解也有很大帮助。
更新
现在ListViews
已经不再使用了。Android 推出了RecyclerView
which 会为您回收视图,但了解 a 的基础知识ListView
有助于理解RecyclerView
.
这是一个参考链接:https ://developer.android.com/guide/topics/ui/layout/recyclerview