Подтвердить что ты не робот

Почему в шаблоне 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;
}
4b9b3361

Ответ 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();
    }
}

Ответ 2

Мое мнение состоит в том, что лучше иметь класс ViewHolder static, поскольку он не будет утечка адаптера.

Если адаптер сохраняет некоторые тяжелые коллекции или даже представления (зависит от каждого конкретного случая), было бы здорово сохранить, какие объекты сохраняют адаптер.

Наличие большого количества объектов в экземплярах внутреннего класса будет иметь те объекты, которые ссылаются на Адаптер, тем самым сохраняя его. Вы должны быть осторожны с тем, как управляются теги (если просмотры очищаются/удаляются автоматически, нет проблем > ).