セクションとセクション ヘッダーを含む ListView を使用しています。以下は、ViewHolder クラスのないアダプターの GetView メソッドです。これは正常に動作しますが、数回スクロールすると UI がフリーズし、複数のデバイスでアプリが強制終了されます。
@Override
public View getView(int position, View v, ViewGroup parent)
{
//View v = convertView;// = convertView;
//System.out.println("getView " + position + " " + convertView);
final Item i = items.get(position);
if (i != null)
{
if(i.isSection())
{
SectionItem si = (SectionItem)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setTypeface(StaticUtils.sTypeFace(context));
sectionView.setText(si.getTitle());
v.setEnabled(false);
}
else
{
EntryItem ei = (EntryItem)i;
v = vi.inflate(R.layout.list_item_entry, null);
final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
final ImageView mImg = (ImageView)v.findViewById(R.id.list_item_entry_drawable);
mImg.getLayoutParams().height = mIvPrams;
mImg.getLayoutParams().width = mIvPrams;
title.setTypeface(StaticUtils.sTypeFace(context));
title.setSelected(true);
if (title != null)
title.setText(ei.title);
imageLoader.displayImage(ei.imgUrl, mImg, options, animateFirstListener);
}
}
return v;
}
ここで、フリーズの問題を改善するために ViewHolder クラスを実装しようとしました。以下は、アダプター用に実装した ViewHolder クラスのコードです。ただし、以下の実装でスクロールすると、ListView がすべてごちゃごちゃになります。その要素のインデックスを保持できません。変更を加えようとすると、下から上にスクロールバックするときに NullPointerException が発生することもあります。
@Override
public View getView(final int position, View v, ViewGroup parent)
{
//View v = null;// = convertView;
//System.out.println("getView " + position + " " + convertView);
final Item i = items.get(position);
if (i != null)
{
if(i.isSection())
{
/*if (convertView == null) {
v = (View) vi.inflate(R.layout.list_item_section, null);
// Do some initialization
} else {
v = convertView;
}*/
if(v==null)
{
mHolder = new ViewHolder();
v = vi.inflate(R.layout.list_item_section, null);
mHolder.s = (SectionItem)i;
mHolder.mSectionView = (TextView) v.findViewById(R.id.list_item_section_text);
v.setTag(mHolder);
}
else
{
mHolder=(ViewHolder)v.getTag();
//v = convertView;
}
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
//final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
mHolder.mSectionView.setTypeface(StaticUtils.sTypeFace(context));
mHolder.mSectionView.setText(mHolder.s.getTitle());
v.setEnabled(false);
}
else
{
//v = vi.inflate(R.layout.list_item_entry, null);
if (v == null) {
mHolder = new ViewHolder();
v = (View) vi.inflate(R.layout.list_item_entry, null);
mHolder.e = (EntryItem)i;
mHolder.mTitle = (TextView)v.findViewById(R.id.list_item_entry_title);
mHolder.mImg = (ImageView)v.findViewById(R.id.list_item_entry_drawable);
mHolder.mImg.getLayoutParams().height = mIvPrams;
mHolder.mImg.getLayoutParams().width = mIvPrams;
v.setTag(mHolder);
// Do some initialization
} else {
mHolder=(ViewHolder)v.getTag();
}
//mHolder.mTitle.setTypeface(StaticUtils.sTypeFace(context));
//mHolder.mTitle.setSelected(true);
if (mHolder.mTitle != null)
mHolder.mTitle.setText(mHolder.e.title);
imageLoader.displayImage(mHolder.e.imgUrl, mHolder.mImg, options, animateFirstListener);
}
}
return v;
}
public class ViewHolder
{
TextView mSectionView, mTitle;
ImageView mImg;
EntryItem e;
SectionItem s;
}
コードを改善し、このアダプター用の適切な ViewHolder クラスを作成する方法についての解決策を得たいと考えています。