高效的适配器实现

时间:2013-04-18 10:06:01

标签: java android performance design-patterns final

我的代码中有两种类型的适配器实现,我不确定哪一种更好。

这是我的更新程序模式:

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变量,它是在我的接口实现之外定义的。 有人可以告诉我这是否会导致性能问题?我不知道带有最终变量的java内部会发生什么。

如果我的更新程序模式不好,请告诉我,为什么我应该使用 ViewHolder 模式,除非此模式来自Google IO。

1 个答案:

答案 0 :(得分:0)

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