gpt4 book ai didi

安卓。 notifyDataSetChanged() 方法和 ListViews 是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 13:25:37 27 4
gpt4 key购买 nike

我试图理解 ListView概念以及它是如何工作的,我正在尝试创建自己的适配器来扩展 BaseAdapter .对于ArrayAdapter例如,有 notifyDataSetChanged()更新包含所有数据的数组列表后应调用的方法,以刷新 ListView .

但我正在创建自己的 BaseAdapter 子类.我无法使用该方法,或者是吗?我如何实现这个方法?基本上,那个方法到底是做什么的,也许我会明白。

如果是 ArrayAdapter我猜它看 ListView 的位置当前正在显示,它会检查它是否与 ArrayList 中的相同更新后?或者……

上面写着方法:

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

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

谁能解释一下?

最佳答案

我想通了。我无法理解适配器到底是如何启动的,以及它是如何知道从哪里获取数据的。当我扩展 BaseAdapter 类时,在该类的构造函数中,我初始化了我想在 ListView 中看到的项目列表。但我无法弄清楚这些值将如何使用以及何时使用。

事情就是这样!!! :

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

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

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

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

另外,需要说明的是,如果您正确实现了 getView(),您最终将回收已显示的项目(对象)(而不是创建新项目)。见 this video 12:00 左右看到正确的实现方式getView()

通过在每个方法中调用 LogCat 并跟踪发生的情况,我已经弄清楚了这一切。

希望这对刚刚开始了解 ListView 工作原理的人有所帮助。

附: This example 对我理解也有很大帮助。

更新

现在 ListViews 不再真正使用了。 Android 推出了 RecyclerView,它为您回收 View ,但了解 ListView 的基础知识有助于理解 RecyclerView

这里有一个链接供引用:https://developer.android.com/guide/topics/ui/layout/recyclerview

关于安卓。 notifyDataSetChanged() 方法和 ListViews 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com