在 ViewHolder 模式中将 ViewHolder 设为静态对于性能至关重要吗?

Posted

技术标签:

【中文标题】在 ViewHolder 模式中将 ViewHolder 设为静态对于性能至关重要吗?【英文标题】:Is it crucial for performance to have ViewHolder as static in a ViewHolder pattern? 【发布时间】:2012-09-04 07:12:28 【问题描述】:

在ViewHolder pattern 中将 ViewHolder 设为静态对性能至关重要吗?

ViewHolder 对象将每个组件视图存储在标签内 布局的字段,因此您可以立即访问它们而无需 需要反复查找。首先,您需要创建一个类 持有你的确切观点。例如:

static class ViewHolder 
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;

【问题讨论】:

【参考方案1】:

这不是强制性的。但是当您这样做时,当您的适配器视图为空时,您将再次使用视图。您正在创建视图并将值分配给视图部件,并使用静态类 ViewHolder 标记整个视图。所以当你回来查看不为空时,那么可见部分将来自获取标签。这样您将创建更少的对象以及更少的适配器工作负载。

【讨论】:

【参考方案2】:

编辑:误解了这个问题——您似乎是在专门询问有关使其成为 static 的问题。这对性能来说不应该是至关重要的,但这个想法是有帮助的。

在此处进行最终编辑:Static nested class in Java, why?

====

原答案如下:

从沉重的 ListView(或其他类型的回收 AdapterView)中挤出性能非常好。然而,最好的判断方法是以某种方式分析性能。

Google IO 2010 他们也推荐这种方法:

http://www.youtube.com/watch?v=wDBM6wVEO70

编辑:

这里还有一个指向 traceview 的链接来描述性能,但我不确定它的效果如何。

http://developer.android.com/tools/debugging/debugging-tracing.html

【讨论】:

【参考方案3】:

这对性能并不重要,它与使用有关。如果ViewHolder 类不是静态的 - 你必须提供父类的实例:

No enclosing instance of type Type is accessible. 
Must qualify the allocation with an enclosing instance of type Type 
(e.g. x.new A() where x is an instance of Type).

【讨论】:

如果 ViewHolder 类在适配器类本身内部使用会怎样?那你就不用提供父类的实例了…… 但这可能会泄漏适配器,如***.com/questions/10864853/…中所指出的那样

以上是关于在 ViewHolder 模式中将 ViewHolder 设为静态对于性能至关重要吗?的主要内容,如果未能解决你的问题,请参考以下文章

封装使用ViewHolder模式的Adapter组件,及用其快速实现聊天界面

android中ViewHolder模式有啥好处?

Android:ViewHolder 模式和不同类型的行?

Andorid ListView使用技巧

交换列表中的项目后自定义列表适配器和 ViewHolder 模式出现问题

Android-进一步封装ViewHolder