在 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组件,及用其快速实现聊天界面