首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓。notifyDataSetChanged()方法和ListViews是如何工作的?

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

Stack Overflow用户
提问于 2012-09-02 01:21:18
回答 4查看 76.6K关注 0票数 63

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

但我正在创建自己的BaseAdapter子类。这种方法对我来说是不可用的,或者是这样的?如何实现此方法?基本上,这个方法到底是做什么的,也许我那时就会明白了。

对于ArrayAdapter,我猜它会查看ListView当前显示的位置,并检查更新后的位置是否与ArrayList中的位置相同?或者..。

它说这个方法:

通知附加的观察者底层数据已更改,任何反映数据集的视图都应刷新自身。

但是它到底是如何自我刷新的呢?

有人能解释一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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

票数 193
EN

Stack Overflow用户

发布于 2012-09-02 01:52:50

BaseAdapter可以被其他类“观察”。当你调用适配器的方法时,它会调用ListViewsetAdapter()registerDataSetObserver。因此,适配器知道谁对新数据感兴趣。

您可以查看BaseAdapter here的源代码。它很小。

notifyDataSetChanged ,你基本上不应该覆盖它(因为它不做任何特殊的事情,所以你可以在你自己的类中重用它)。

票数 13
EN

Stack Overflow用户

发布于 2012-09-02 01:33:10

假设您的ListView显示了一些存储在ArrayList中的数据。

在更改了ArrayList的内容之后,您需要告诉list数据源已经更改,并且它需要重新绘制自身以显示新数据。

所以,这就是notifyDatasetChanged()的用武之地。它告诉ListView数据已经被修改;为了显示新数据,必须重新绘制ListView

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12229817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档