我正在尝试理解ListView
的概念和它是如何工作的,并且我正在尝试创建我自己的扩展BaseAdapter
的适配器。例如,对于ArrayAdapter
,为了刷新ListView
,应该在更新包含所有数据的数组列表之后调用notifyDataSetChanged()
方法。
但我正在创建自己的BaseAdapter
子类。这种方法对我来说是不可用的,或者是这样的?如何实现此方法?基本上,这个方法到底是做什么的,也许我那时就会明白了。
对于ArrayAdapter
,我猜它会查看ListView
当前显示的位置,并检查更新后的位置是否与ArrayList
中的位置相同?或者..。
它说这个方法:
通知附加的观察者底层数据已更改,任何反映数据集的视图都应刷新自身。
但是它到底是如何自我刷新的呢?
有人能解释一下吗?
发布于 2012-09-02 16:34:10
我已经弄明白了,。我不明白这个该死的适配器是怎么启动的,它怎么知道从哪里获取数据的。当我扩展BaseAdapter
类时,我在该类的构造函数中初始化了希望在ListView
中看到的项目列表。但我不知道这些值将如何使用以及何时使用。
是这样的!:
在BaseAdapter
中,有一些方法需要被覆盖。其中就有getCount()
。
当创建ListView
时,它调用getCount()
。如果返回的值不是0(我返回的是之前在构造函数中初始化的ArrayList的大小),那么它调用getView()
的次数就足以填满屏幕上的项。以为例,我用20个项目初始化了ArrayList
。因为最初只有8个项目可以显示在屏幕上,所以getView()
被调用了8次,每次都要求我返回它所需的位置(更准确地说,它想知道该行在列表中该特定位置上的外观,以及它需要包含哪些数据)。如果我向下滚动列表,getView()
会被一次又一次地调用,直到我到达列表的末尾,在我的例子中是20项/行。
notifyDataSetChanged()
做的是..。当被调用时,它会查看调用时屏幕上显示了哪些项目(更准确地说,是哪一行索引),并使用这些位置调用getView()
。
,即如果你显示列表中的前8个项目(这些是在屏幕上可见的项目),你在列表中的第二个和第三个项目之间添加另一个项目,然后调用notifyDataSetChanged()
,那么getView()
将被调用8次,位置从0开始,以7结束,因为在getView()
方法中,你从ArrayList
获取数据,所以它将自动返回插入列表中的前8个项目中的7个(7而不是8,因为最后一个项目向下了一个位置,所以它不再可见)。然后ListView
将使用这些项重新绘制或执行其他操作。
此外,需要指定的重要一点是,如果正确实现了getView()
,则最终将回收已显示的项(对象)(而不是创建新的项)。请在12:00分钟左右查看,了解实现getView()
的正确方法
通过在每个方法中调用LogCat
并跟踪发生的事情,我已经弄清楚了这一切。
希望这篇文章能帮助那些刚刚开始了解ListView
的工作原理的人。
另外,也帮助我理解了很多。
更新
如今,ListViews
已经不再被真正使用了。安卓推出了RecyclerView
,它可以为你回收视图,但了解ListView
的基础知识有助于理解RecyclerView
。
这里有一个供参考的链接:https://developer.android.com/guide/topics/ui/layout/recyclerview
发布于 2012-09-02 01:52:50
BaseAdapter
可以被其他类“观察”。当你调用适配器的方法时,它会调用ListView
的setAdapter()
的registerDataSetObserver
。因此,适配器知道谁对新数据感兴趣。
您可以查看BaseAdapter
here的源代码。它很小。
notifyDataSetChanged
是,你基本上不应该覆盖它(因为它不做任何特殊的事情,所以你可以在你自己的类中重用它)。
发布于 2012-09-02 01:33:10
假设您的ListView
显示了一些存储在ArrayList
中的数据。
在更改了ArrayList
的内容之后,您需要告诉list数据源已经更改,并且它需要重新绘制自身以显示新数据。
所以,这就是notifyDatasetChanged()
的用武之地。它告诉ListView
数据已经被修改;为了显示新数据,必须重新绘制ListView
。
https://stackoverflow.com/questions/12229817
复制相似问题