【问题标题】:Efficient Adapter implementation高效的适配器实现
【发布时间】: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


【解决方案1】:

这样的决定对性能几乎没有影响。两种解决方案同样有效。最终的键盘实际上可以通过允许编译器进行某些优化来提高性能,但它们肯定不会引起注意。

【讨论】:

  • 我的观点是,当我的适配器需要处理多种类型 (getViewTypeCount()) 并且我有 1000 个元素并且用户通过此列表快速滚动时,我的应用程序需要快速执行更新。所以这很重要。但总的来说,你是对的。我发现this answer 支持你的说法,即没有不良影响。
猜你喜欢
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多