【发布时间】:2013-04-18 10:06:01
【问题描述】:
我的代码中有两种用于适配器实现的类型,但我不确定哪一种更好。
这是我的 updater 模式:
public View getView(int position, View convertView, ViewGroup parent) {
Updater content;
if(convertView == null) {
final TextView msg = new TextView(parent.getContext());
content = new Updater() {
public void update(...) {
// code to update the control msg
}
};
convertView = msg;
convertView.setTag(content);
} else {
content = (Updater)convertView.getTag();
}
content.update(...);
return convertView;
}
// ...
private interface Updater {
void update(...);
}
这是我的 ViewHolder 模式:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
convertView = inflater.inflate(...);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.setData(...);
return convertView;
}
// ...
private class ViewHolder {
public final TextView text;
public ViewHolder(final View owner) {
text = (TextView)owner.findViewById(R.id.text);
}
public void setData(...) {
// ...
}
}
我想知道哪个更高效?我还可以在更复杂的控件中实现Updater 接口,因此更新不同的控件更简单以一种常见的方式。所以我可以直接将convertView 投射到我的界面而不使用getTag()。但在上面的代码中,我使用了一个在我的接口实现之外定义的final 变量。 谁能告诉我这是否会导致性能问题?我不知道带有 final 变量的 java 内部会发生什么。
如果我的 updater 模式不好,请告诉我,为什么我应该使用 ViewHolder 模式,除了这个模式来自 Google IO。
【问题讨论】:
-
我不明白为更新程序提供接口的意义,因为显然您只有一个实现。因此,区别似乎仅在于您放置 update/setData 实现的位置,即在 getView 的匿名类中或 ViewHolder 类中。对我来说完全一样
-
我的意思是我不确定是否应该在接口实现之外使用多个最终字段。这是低效的吗?我不知道 final 关键字在 Java VM 或 Dalvik VM 中的作用。 update 函数的代码几乎相同。我可能有多个需要更新的元素。
标签: java android performance design-patterns final