8

在 android listview 上覆盖 baseadapter 时,您必须实现此方法public View getView(int position, View convertView, ViewGroup parent)。convertview 是先前在滚动时从列表中推出的视图,并且给出它以便您可以重用该视图而不是创建新视图。

我的问题是,真的有必要重用视图吗?如果只更改一部分数据,我可以理解重用它。但是创建视图的开销真的那么大吗?我见过的每个关于使用列表视图的教程都告诉你回收视图,即使是在像文本视图这样简单的视图上也是如此。

我想我的问题是为什么谷歌决定将此作为该getView方法的默认行为?

4

2 回答 2

13

回收视图的几个原因:

  • 对象创建相对昂贵。创建的每个额外对象都需要由垃圾收集系统处理,并且至少会暂时增加您的内存占用
  • 这对于更复杂的视图更为重要,但膨胀和布局视图对象可能会很昂贵。大多数情况下,您只需对 getView 中的视图进行不会影响布局的微小更改(例如,设置文本),因此您可能能够避免布局开销。
  • 请记住,Android 设计为在资源受限的环境中运行。
  • 最后,它已经为您完成了,而且它肯定不会伤害任何东西,所以为什么不使用它呢?
于 2010-09-28T23:14:21.233 回答
7

有必要吗?仅当您在 Nexus One 上投掷时喜欢额外的 30-40 fps 时。:)(参见http://code.google.com/events/io/2010/sessions/world-of-listview-android.html中的幻灯片,幻灯片 13-17)

为什么忽略一项已为您完成 95% 的重大优化,让设备完成它不需要的工作?

于 2010-09-29T03:40:59.063 回答