【问题标题】:Recycling views in a listview, worth it?在列表视图中回收视图,值得吗?
【发布时间】:2010-09-28 22:59:06
【问题描述】:

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

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

我想我的问题是为什么 google 决定将其设为 getView 方法的默认行为?

【问题讨论】:

  • 这并不难,而且框架让它变得简单。所以是的,显然值得。

标签: android listview android-arrayadapter


【解决方案1】:

回收视图的几个原因:

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

【讨论】:

  • 不这样做的至少一个原因是,如果您想为列表视图中的不同行设置不同的布局。如果您实际使用不同的布局,则无法回收 Concert 视图。为了能够回收,您需要将各种可能的行视图组合成一个超级视图。这比不回收更小的视图更贵吗?我不知道。
  • @JeffreyBlattman 错了。 BaseAdapter 通过 getItemViewType(int position) 和 getViewTypeCount() 支持不同的列表视图项。在您在 getView() 中提供正确的视图后,ListView 将为您处理正确的回收。
【解决方案2】:

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

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

【讨论】:

  • 我想这是我的问题。重用视图的开销究竟是什么
  • 从 XML 膨胀是其中很大一部分。对象流失不太重要,但会导致在投掷期间出现明显的 GC 暂停,尤其是在旧设备上。
猜你喜欢
  • 2011-12-07
  • 2015-01-11
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
相关资源
最近更新 更多