我正在使用带有部分和部分标题的 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 类。