Почему в шаблоне 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;
}
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 статический, поскольку он не будет пропускать адаптер.
Если адаптер сохраняет некоторые тяжелые коллекции или даже представления (зависит от каждого конкретного случая), было бы здорово сохранить контроль над тем, какие объекты сохраняют адаптер.
имея много экземпляров объектов внутреннего класса, эти объекты будут ссылаться на адаптер,сохраняя его. Вы должны быть осторожны с тем, как управляются теги (если представления чистятся/удаляются автоматически нет проблем>).