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

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

Solutions Collecting From Web of "为什么在ViewHolder模式中ViewHolder类应该是静态的?"

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

如果内部类是非静态的:

 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类静态,因为它不会泄漏适配器。

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

拥有大量的内部类的对象实例将有这些对象引用适配器,从而保留它。 你应该小心如何pipe理标签(如果视图被清除/自动删除没有问题>)。