2012-05-12 5 views
21

、私は通常ListViewのためのビューを作成するためにMyAdapter extends ArrayAdapterを使用し、その結果として、私はしかし、私は正確に何convertViewparentを行う知らない関数にListViewアダプタで `convertView`の目的は何ですか?アンドロイドで

public View getView(int position, View convertView, ViewGroup parent) { 
    // somecode here 
} 

を上書きする必要があります!誰にでも提案はありますか?詳細、より多くのヘルプ!ありがとう!ドキュメントから

答えて

38

convertView - 再利用する古いビュー、可能な場合。注意:使用する前に、このビューがnullではなく、適切なタイプであることを確認する必要があります。このビューを変換して正しいデータを表示できない場合、このメソッドは新しいビューを作成できます。

つまり、このパラメータは厳密にはAdapterのパフォーマンスを向上させるために使用されます。 ListViewAdapterを使用してその行にViewを入力すると、アダプタは各行にgetView()を呼び出して各リスト項目にViewオブジェクトを設定します。アダプターは、もう使用されていない古いViewオブジェクトをリサイクルする方法としてconvertViewを使用します。このように、ListViewは、アダプターが新しいリスト項目を表示するたびに、まったく新しいオブジェクトをインスタンス化する代わりに、表示されなくなった古い「再生済み」ビュー・オブジェクトをアダプターに送信することができます。これはconvertViewパラメータの目的です。

4

convertViewは表示されないListView Item Cacheであるため、再利用することができます。 ListViewは多くのListItemを作成する必要がないため、Memeoryを保存してListViewをよりスムーズにすることができます。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    if(convertView == null) { 
     view = this.inflator.inflate(android.R.layout.simple_list_item_1, parent, false); 
    } 
    else { 
     view = convertView; 
    } 
    // remaining implementation 
    return view; 
} 
+1

だから私は、XMLファイルを膨張させることなく、私の見解を構築する場合、私はconvertViewを使用する必要がありますか? –

+0

@DanChaltielはい、あなたは – localhost

21

convertViewは、古いビューを再利用するために使用されます。

ご理解くださいAdapterfunctionalityアンドロイドAdapterを使用すると、一部のビューを新しいデータで再利用できます。

リストが15個のアイテムであってもウィンドウに5個のアイテムしか表示されない場合は、最初にconvertViewはnullになります。これらの5個のアイテムの新しいビューを作成する必要がありますが、オプションを使用して、6-10のビューを作成するか、古いビューを再利用し、これらのビューに新しいデータをロードします。 AdapterおよびconvertViewを使用すると、後で行うことができます。

+0

非常に便利です。簡単な言葉で説明します。 – tpk

1

短いバージョン

@Alexロックウッドさんを読み、JEETの答え@してください。

私の答え:なぜ前

優れている/ getView()convertViewを使用しての適切方法はありますか?このvideoのRomain Guyによってよく説明されています。上記

@Override 
public View getView(final int position, View convertView, ViewGroup parent)   { 
    View rowView = convertView; 
    ViewHolder holderObject; 

if (rowView == null) { 
    rowView = inflater.inflate(R.layout.list_single_post_or_comment, parent, false); 
    holderObject = new HolderForContent(); 
    mapHolder(holderObject, rowView); 
    rowView.setTag(holderObject); 
    } else { 
    holderObject = (HolderForContent) convertView.getTag(); 
    } 
    setHolderValues(holderObject, position); 
    return rowView; 
} 

private class ViewHolder { 
    TextView mTextView; 
} 

mapHolder(holderObject, rowView) { 
    //assume R.id.mTextView exists 
    holderObject.mTextView = rowView.findViewById(R.id.mTextView); 
} 

setHolderValues(holderObject, position) { 
    //assume this arrayList exists 
    String mString = arrayList.get(position).mTextViewContent; 
    holderObject.mTextView.setText(mString); 
} 

一例であり、あなたは、パターンのいずれかのタイプに従うことができます。しかしはこの

convertView目的に来
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     // todo : inflate rowView. Map view in xml. 
    } else { 
     // todo : get already defined view references 
    } 

    // todo : set data to display 

return rowView; 

} 

を覚えています。 なぜ

convertViewが既に作成されたビューを再作成しないことによってパフォーマンスの最適化 [ロマンガイによってスライド14にseeチャート]のために使用されます。

ソース: 修正が歓迎されます。私は実際にこれらのリンクを通じてこの情報を集めました。

documentationgetView()についてはこちらをご覧ください。

ロマンガイについてはgetView()videoで、Google IO 2009で「Turbo Charge Your UI」、プレゼンテーションにはmaterialを使用しています。

すばらしいblog Lucas Rocha。

ソースコードを深く掘り下げたい人:ListViewimplementationgetView()のサンプルは、arrayAdapterのソースコードにあります。

よくある投稿です。

how-do-i-choose-convertview-to-reuse

how-does-the-getview-method-work-when-creating-your-own-custom-adapter

関連する問題