2012-11-22 4 views
22

jestem po prostu staramy się mieć lepsze zrozumienie poniższego wzoru I regularnie korzysta w celu optymalizacji ListViewDlaczego we wzorcu ViewHolder klasa ViewHolder powinna być statyczna?

Moje odczyty tylko wskazał mi na to, że statyczne klasy wewnętrzna jest traktowany jako najwyższej klasy poziomu. Jaka jest korzyść z takiej rzeczy w porównaniu z klasą członka (nie statyczną)?

@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; 
} 
+5

ponieważ jeśli nie jest, klasa jest połączona z instancją, co jest całkowicie zbędne. – njzk2

+0

@ njzk2: co byłoby wadą? –

+0

@ Jan1337z wadą jest to, że masz instancję obiektu klasy dla każdej instancji adaptera, jeśli obiekt ViewHolder nie jest statyczny. – njzk2

Odpowiedz

4

Jedną z zalet używania statycznej klasy wewnętrznej jest to, że dostęp do klasy wewnętrznej można uzyskać za pomocą metod statycznych, bez konieczności występowania klasy zewnętrznej.

Jeśli wewnętrzna klasa non-static:

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

Jeśli wewnętrzna klasa jest statyczna:

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

Nie jestem pewien, czy to całkowicie odpowiada na pytanie o wzór ViewHolder ... –

+0

@ j0k NathanZ napisał: "Moje odczyty wskazywały tylko na fakt, że statyczna wewnętrzna klasa jest traktowana jako klasa najwyższego poziomu. korzyść z takiej rzeczy w porównaniu z klasą członka (nie statyczną)? " Moja odpowiedź nie musi koniecznie odwoływać się do wzorca ViewHolder, właśnie wskazałem jedną z zalet używania statycznej klasy wewnętrznej ponad niestatyczną. O ile mi wiadomo, pytanie dotyczyło raczej zalet korzystania z klas statycznych niż w przypadku wzorca ViewHolder. –

+0

@IllyesIstvan Chyba chcesz odpowiedzieć Igorowi, nie mnie :) – j0k

7

Moja opinia jest taka, że ​​lepiej jest mieć klasę ViewHolder statyczne jak to won” t wyciek adaptera.

Jeśli adapter zachowuje ciężkie kolekcje lub nawet widoki (w zależności od konkretnego przypadku), dobrze byłoby zachować kontrolę nad tym, które obiekty zachowują adapter.

Posiadanie wielu obiektów wystąpień klasy wewnętrznej będzie miało te obiekty, które odwołują się do adaptera, zachowując go. Powinieneś być ostrożny w zarządzaniu tagami (jeśli widoki są czyszczone/usuwane automatycznie, nie ma problemu>).