listview
項目を垂直方向にスクロールするリストを表示するビュー。
縦スクロールの子項目を表示するリストビュー Android開発では、データを縦方向に表示するために多くの場所で使用されます。 listview の使用は、data--、interface--xml およびadapter--adapter を使用する標準のアダプター モードです。データは、データの表示方法を XML で記述し、アダプターで制御されます。活動。
カスタム アダプターを使用する場合は、getView メソッドを書き直す必要があります。getView メソッドはユーザーのアイテムのビューとデータを生成します。
画像を参照してください:
ここにはビューを再利用する最適化があり、これによりメモリ消費が削減され、アイテムの読み込みが高速化されます。
getView での最適化に関しては、皆さんも困っているはずです。以下に 3 つの最適化方法をまとめました。
最初:
convertView を再利用します。これにより、メモリ消費が大幅に削減されます。 ConvertView が null であるかどうかを判断し、null である場合は、ビューを生成し、そのビューにデータを与え、最後にビューを最下層に返してユーザーに提示する必要があります。
機能: 現在のconvertViewがnullの場合、LayoutIn flatを通じてビューが生成されます。
ViewCode publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { if(convertView==null) { convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); } TextViewtv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); TextViewtv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); ContactInfo1confo=contacts.get(position); if(confo!=null){//toseteveryitem'stext tv_name.setText(confo.getContactName()); tv_phone.setText(confo.getContact_Phone()); } returnconvertView; }
2 番目:
上記の書き方には欠点があります。つまり、VIew を取得するたびに、findViewById を再度見つけ、コントロールを再度見つけて、コントロールの値を割り当て、それに応じてイベントを設定する必要があります。実際には、geiview にはこれらのコントロールが含まれており、これらのコントロールの ID はすべて同じであるため、これは実際には繰り返しの処理を行っています。つまり、ビュー内で ViewById を見つける必要があるのは 1 回だけであり、ViewById を見つける必要はありません。毎回。
2 番目の書き方を以下に示します。
書き方の特徴は、通常、内部クラス classViewHolder があり、この ViewHolder は、onClick などの一部のイベントに対応する操作の設定を容易にするために使用されます。これにより、毎回 findViewById を実行する必要がなくなり、パフォーマンスの消費が軽減されます。同時に、convertView が再利用されるため、メモリ消費が大幅に削減されます。
ViewCode publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { ViewHolderholder; if(convertView==null){ convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); holder=newViewHolder(); holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); convertView.setTag(holder); } else { holder=(ViewHolder)convertView.getTag(); } ContactInfo1confo=contacts.get(position); Log.i("my","confo"+confo.getContactName()); if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } returnconvertView; } classViewHolder { TextViewtv_name,tv_phone; }
3 番目:
個人的には、この書き方が最も快適だと思います。最も快適な書き方とは、コードを見てとてもすっきりし、非常に明確であることを意味します。
特徴: 内部クラスclassViewHolderを使用し、convertViewを再利用します。
2 番目の書き方との違いは、一時変数 Viewview=convertView を使用し、ビューを変更し、最後にビューに戻ることです
ViewCode @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { Viewview=convertView; ViewHolderholder; if(view==null){ view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); holder=newViewHolder(); holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); view.setTag(holder); } else { holder=(ViewHolder)view.getTag(); } ContactInfo1confo=contacts.get(position); Log.i("my","confo"+confo.getContactName()); if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } returnview; } classViewHolder { TextViewtv_name,tv_phone; }
上記は、初心者が学び、要約するための集中的な書き方です。
ソース コードは次のとおりです: LisViewTest.zip
階下の友人から提供された提案によると、最新の更新は次のとおりです:
ViewCode @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent) { Viewview=convertView; ViewHolderholder; if(view==null){ view=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null); holder=newViewHolder(); holder.tv_name=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone=(TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); view.setTag(holder); } else { holder=(ViewHolder)view.getTag(); } ContactInfo1confo=contacts.get(position); Log.i("my","confo"+confo.getContactName()); if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } returnview; } <fontcolor="\"#0000ff\""></font>staticclassViewHolder { TextViewtv_name,tv_phone; }
注: staticclassViewHolder
ここで ViewHolder を静的に設定します。静的クラスは、最初のロードに時間がかかりますが、同時にメモリ内に ViewHolder が 1 つだけ存在するようになり、メモリのオーバーヘッドが節約されます。 。