在ViewHolder模式中,为什么ViewHolder类应该是静态的?

23

我只是想更好地理解我经常用来优化 ListView 的以下模式。

我的阅读资料只告诉我,静态内部类被视为顶层类。与成员类(非静态)相比,这样做的好处是什么?

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Comment comment = getItem(position);
    ViewHolder holder;
    if (convertView == null){
        holder = new ViewHolder();
        convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, null);
        holder.nickname = (TextView) ((ViewGroup) convertView).findViewById(R.id.nickname);
        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    holder.nickname.setText(comment.getMember_nickname());
    CharSequence
    return convertView;
}

public static class ViewHolder{
    TextView nickname;
}

5
因为如果不这样做,类会与实例相关联,这是完全不必要的。 - njzk2
@njzk2:有什么不利之处吗? - Langusten Gustel
@Jan1337z 的缺点是,如果 ViewHolder 不是静态的,则每个适配器实例都有一个类对象的实例。 - njzk2
@njzk2:那就是浪费内存了 - 就这样? - Langusten Gustel
1
@Jan1337z浪费了内存和设置时间来创建类实例并销毁它。在这种特定情况下,我认为这就是全部,还有其他内部类的情况存在其他缺点。 - njzk2
2个回答

8

我的观点是将 ViewHolder 类设为静态的更好,因为这样不会泄漏 Adapter。

如果适配器保留了一些重量级的集合甚至视图(取决于每个特定案例),则最好控制哪些对象保留了适配器。

拥有许多内部类实例的对象将引用适配器,从而保留它。您应该小心管理标记(如果视图自动清除/删除,则没有问题>)。


4
使用静态内部类的一个好处是,在没有外部类的实例的情况下,可以从静态方法中访问内部类。
如果内部类是非静态的:
class MyOuter {
    private int x = 7;
    public void makeInner() {
        MyInner in = new MyInner();
        in.seeOuter();
    }
    class MyInner {
        public void seeOuter() {
            System.out.println("Outer x is " + x);
        }
    }
}

public static void main(String[] args) {
    MyOuter mo = new MyOuter();
    MyOuter.MyInner inner = mo.new MyInner();
    inner.seeOuter();
}

如果内部类是静态的:
class BigOuter {
    static class Nest {void go() { System.out.println("hi"); } }
}

class Broom {
    static class B2 {void goB2() { System.out.println("hi 2"); } }
    public static void main(String[] args) {
        BigOuter.Nest n = new BigOuter.Nest();
        n.go();
        B2 b2 = new B2();
        b2.goB2();
    }
}

2
我不确定这是否完全解决了ViewHolder模式的问题... - IgorGanapolsky
NathanZ写道:“我的阅读只是让我知道静态内部类被视为顶级类。与成员类(非静态)相比,这样做的好处是什么?” 我的回答并不一定涉及ViewHolder模式,我只是指出了使用静态内部类而不是非静态内部类的好处之一。 据我所知,这个问题更多地涉及使用静态内部类的好处,而不是ViewHolder模式。 - Illyes Istvan
@IllyesIstvan 我想你应该是想回复伊戈尔,而不是我 :) - j0k
@j0k 是的。我的错误。 - Illyes Istvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接