在ViewHolder类ViewHolder模式为什么应该是静态的?(Why in ViewHold

2019-08-03 03:15发布

我只是想有更好的理解以下模式的我经常使用优化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;
}

Answer 1:

使用静态内部类的一个好处是,内类可以从静态方法进行访问,而无需外部类的一个实例。

如果内部类的非静态:

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();
    }
}


Answer 2:

我的看法是,最好是有ViewHolder类的静态,因为它不会泄露适配器。

如果适配器保留了一些沉重的集合,甚至浏览次数(取决于每个具体情况),这将是巨大的,以保持它的对象保留适配器控制。

有很多内部的类的对象实例会引用这些适配器的对象,从而保留它。 你应该小心怎样标签管理(如果该视图清洗/自动解除没有问题>)。



文章来源: Why in ViewHolder pattern should the ViewHolder class be static?