2012-11-22 125 views
22

我只是想更好地理解以下我經常用來優化的模式ListView爲什麼在ViewHolder模式下ViewHolder類應該是靜態的?

我的讀物只指出了靜態內部類被視爲頂級類的事實。與類成員(非靜態)相比,這樣的事情有什麼好處?

@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

因爲如果不是,該類鏈接到實例,這是完全不需要的。 – njzk2

+0

@ njzk2:缺點是什麼? –

+0

@ Jan1337z缺點是,如果ViewHolder不是靜態的,那麼您的適配器的每個實例都有一個類對象的實例。 – njzk2

回答

4

使用靜態內部類的一個好處是可以從靜態方法訪問內部類,而不需要外部類的實例。

如果內部類的非靜態:

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模式的問題... –

+0

@ j0k NathanZ寫道:「我的讀物只是指出了靜態內部類被視爲頂級類的事實。與會員類(非靜態)相比,這種事情的好處是什麼?「 我的答案並不一定引用ViewHolder模式,我只是指出了使用靜態內部類比非靜態類的好處之一。 據我所知,問題更多的是關於使用靜態內部類而不是關於ViewHolder模式的好處。 –

+0

@IlylyIstvan我想你想回復伊戈爾,而不是我:) – j0k

7

我的看法是,最好是有ViewHolder類的靜態爲它贏得」不要泄漏適配器。

如果適配器保留了一些沉重的集合甚至視圖(取決於每個特定的情況),保持控制哪些對象保留適配器將是非常好的。

擁有大量內部類的對象實例將使這些對象引用適配器,從而保留它。你應該小心如何管理標籤(如果視圖被自動清理/移除,沒有問題>)。

相關問題