8

検索した後、静的ホルダークラスを作成してその中にビューを割り当てる理由を尋ねたかった簡単な質問が1つあります?? 私の疑問を解消してください。それは私にとって大きな助けになります。

4

3 に答える 3

7

findViewById()のスクロール中にコードが頻繁に呼び出され、ListViewパフォーマンスが低下する可能性があります。アダプターがリサイクルのために膨張したビューを返した場合でも、要素を検索して更新する必要があります。の繰り返し使用を回避する方法は、デザイン パターンfindViewById()を使用することです。"view holder"

オブジェクトは、レイアウトのタグ フィールド内に各コンポーネント ビューを格納するViewHolderため、繰り返し検索する必要なくすぐにアクセスできます。最初に、正確な一連のビューを保持するクラスを作成する必要があります。

詳細については、Android ガイドラインを参照してください。

  1. したがって、「ビュー ホルダー」を使用している場合は、ルックアップを必要とせずに各ビューに簡単にアクセスできるため、貴重なプロセッサ サイクルを節約できます。
  2. ビューに があるstatic inner classと、パフォーマンスが大幅に向上します

Android が静的クラスを好む理由のリンクも参照してください。

もう 1 つの興味深いリンクHow ListView Workは、このブログを読んだ後、開発者は LisView のロジックと、listView の内部静的クラスを実装する必要がある理由を明確にすることができます。

于 2012-07-19T11:41:28.443 に答える
2

作品がどのように機能するかを理解していれば、答えも簡単ですAdapterView

AnAdapterViewは、子が。によって決定されるビューですAdapterAdapterView(より具体的には、のような具体的な実装)ListViewには、任意の時点で表示される情報よりも多くの情報が含まれています。メモリ消費を最適化するために、またパフォーマンスのために、Adapter通常Viewは個々のアイテムを表すを再利用します。Viewしたがって、対応するデータよりもオブジェクトの数が少なくなります。

再利用されるオブジェクトは、Viewsまたは。の複雑な階層にすることができますViewGroups。したがって、この階層内から個々のオブジェクトを検索する場合は、メソッドViewに依存する必要がありfindViewById()、ビュー階層に複数のレベルがある場合、これはコストがかかります。そのため、単純化するために(また、パフォーマンスを向上させるために)、View-Holderパターンが使用されます。このパターンでは、View関心のある個々のオブジェクトが静的内部クラスに割り当てられます。

View-Holderパターンの詳細については、 LarsVogelのAndroidListViewおよびListActivity-チュートリアルを参照してください。

于 2012-07-19T11:33:45.937 に答える
1

最適化ポイントです。viewHolder がないと、毎回 findViewById メソッドを呼び出す必要があります。viewHolder を使用すると、これらを 1 回呼び出すだけで済みます。

TextView と ImageView の例:

  • ViewHolder なし:

    if (convertView == null) {
        convertView = mInflater.inflate(..., null);
    }
    //Following called each time
    TextView tv = (TextView)convertView.findViewById(...);
    ImageView iv = (ImageView)convertView.findViewById(...);
    
    tv.setText(...)
    
  • ViewHolder を使用:

    if (convertView == null) {
        convertView = mInflater.inflate(..., null);
        holder = new ViewHolder();
        //called once
        holder.tv = (TextView) vi.findViewById(..);
        holder.iv = (ImageView) vi.findViewById(...);
        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }
    
    
    holder.tv.setText(...)
    
于 2012-07-19T11:29:12.090 に答える