I have in my code two types for Adapter implementations and I'm not sure which one is better.
Here is my updater pattern:
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(...);
}
And here is my ViewHolder pattern:
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(...) {
        // ...
    }
}
I'm wondering which one is more effency? I could also implement the Updater interface in a more complex control, so it is simpler to update differnt controls in a common way. So I could just cast the convertView to my interface without using getTag(). But in the code above I use a final variable which is defined outside of my interface implementation. Can somebody tell me if this can make performance problems? I don't know what happens internal in java with a final variable.
If my updater pattern is bad please tell me, why I should use the ViewHolder pattern except that this pattern is from Google IO.
 
    