【问题标题】:Why in ViewHolder pattern should the ViewHolder class be static?为什么在 ViewHolder 模式中 ViewHolder 类应该是静态的?
【发布时间】:2012-11-11 02:17:46
【问题描述】:

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

【问题讨论】:

  • 因为如果不是,则类链接到实例,这是完全没有必要的。
  • @njzk2:有什么缺点?
  • @Jan1337z 缺点是,如果 ViewHolder 不是静态的,您的适配器的每个实例都有一个类对象的实例。
  • @njzk2:那是浪费内存——仅此而已?
  • @Jan1337z 浪费了内存和设置时间来创建类实例并销毁它。在这种特殊情况下,我认为仅此而已,内部类的其他情况还有其他缺点。

标签: java android android-viewholder


【解决方案1】:

我的观点是 ViewHolder 类最好是静态的,因为它不会泄漏适配器。

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

如果有很多内部类的对象实例,这些对象就会引用适配器,从而保留它。您应该注意标签的管理方式(如果视图被自动清理/删除,则没有问题>)。

【讨论】:

    【解决方案2】:

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

    如果内部类是非静态的:

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

    【讨论】:

    • 我不确定这是否完全解决了 ViewHolder 模式的问题...
    • @j0k NathanZ 写道:“我的阅读只指出静态内部类被视为顶级类的事实。与成员类(非静态)?”我的回答不一定是指 ViewHolder 模式,我只是指出了使用静态内部类而不是非静态的好处之一。据我所知,问题更多是关于使用静态内部类的好处,而不是关于 ViewHolder 模式。
    • @IllyesIstvan 我猜你想回复 Igor,而不是我 :)
    • @j0k 是的。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2014-02-25
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多