2012-11-22 14 views
22

私はちょうど私が定期的にListViewViewHolderクラスを静的にする必要があるのはなぜ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

静的な内部クラスを使用するメリットの1つは、外部クラスのインスタンスを持たずに静的メソッドから内部クラスにアクセスできることです。

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

内部クラスが静的である場合:

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パターンを参照しているわけではありません。静的な内部クラスを非静的なものよりも使用する利点の1つを指摘しました。 私が知る限り、静的な内部クラスを使用する利点は、ViewHolderパターンよりも重要でした。 –

+0

@IllyesIstvan私はあなたがイゴール、私ではないと返信したいと思います:) – j0k

7

私の意見はそれは勝ったような静的ViewHolderクラスを持っている方が良いということですアダプターをリークしないでください。

アダプターに重いコレクションやビュー(たとえ特定のケースによって異なる)が保持されている場合は、どのオブジェクトがアダプターを保持しているかを制御することは大変便利です。

内部クラスの多くのオブジェクトインスタンスには、アダプタを参照するオブジェクトがあり、それを保持します。タグがどのように管理されているかについては注意が必要です(ビューが自動的に消去/削除される場合は問題ありません)。

関連する問題