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