Android系统。notifyDataSetChanged()方法和ListViews如何工作?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (51)

方法是这样的:

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

但它究竟如何更新自身呢?

提问于
用户回答回答于

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

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

如果这返回一个不等于0的值(我返回了之前在构造函数中初始化的ArrayList的大小),那么它会调用getView()足够的次数来填充屏幕上的项目。例如,我初始化了ArrayList20个项目。因为最初只有8个项目适合在屏幕上,getView()被称为8次,每次都要求我返回所需的位置(更确切地说,它想知道该列在该特定位置上的样子,哪些数据它需要包含)。

如果你正在显示列表中的前8个项目(所以那些是在屏幕上可见的项目),并且你在列表中的第二个和第三个项目之间添加另一个项目,notifyDataSetChanged()然后你打电话getView()被称为8次,从0到7结束,因为在这个getView()方法中你从中获得数据,ArrayList那么它会自动返回列表中插入的新项目和前8个项目中的7个项目(7而不是8,因为最后一个项目去了一个位置下来,所以它不再可见),并将ListView这些项目重绘,或任何其他。

我已经通过在每种方法中发出呼叫并遵循发生的情况来计算所有这些LogCat

用户回答回答于

BaseAdapter可以被其他类“观察”。当你调用的方法,ListView setAdapter()它的电话registerDataSetObserver适配器。所以,适配器知道谁对新数据感兴趣。

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

扫码关注云+社区

领取腾讯云代金券