我的自定义ListView适配器有问题。我想使用ViewHolder(因为我的列表视图有100多个元素),但是当我使用代码时,列表视图会循环。循环是指仅显示初始位置,并循环显示它们的外观,直到列表视图结束。我从这个站点建议:Click。
这是我的代码:
public class ListList extends ArrayAdapter<String>{
private final String[] web;
private final Integer[] imageId;
Context context;
public ListList(Context context,
String[] web, Integer[] imageId) {
super(context, R.layout.champion_list, web);
this.context = context;
this.web = web;
this.imageId = imageId;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
if(v == null) {
LayoutInflater inflater = LayoutInflater.from(context);
v = inflater.inflate(R.layout.champion_list, null);
holder.txt = (TextView)v.findViewById(R.id.txt);
holder.img = (ImageView)v.findViewById(R.id.img);
holder.txt.setText(web[position]);
holder.img.setImageResource(imageId[position]);
v.setTag(holder);
}
else {
// View recycled !
// no need to inflate
// no need to findViews by id
holder = (ViewHolder) v.getTag();
}
return v;
}
static class ViewHolder {
TextView txt;
ImageView img;
}
}
任何想法我做错了吗?我尝试从if语句中放出.setText和.setImageResource,并且它可以正常工作,但是根据此站点,我做错了...也可以给我一些技巧,以使列表视图“无滞后”吗?
尝试一下:
ViewHolder holder = new ViewHolder();
if(v == null) {
LayoutInflater inflater = LayoutInflater.from(context);
v = inflater.inflate(R.layout.champion_list, null);
holder.txt = (TextView)v.findViewById(R.id.txt);
holder.img = (ImageView)v.findViewById(R.id.img);
v.setTag(holder);
}
else {
holder = (ViewHolder) v.getTag();
}
//move here
holder.txt.setText(web[position]);
holder.img.setImageResource(imageId[position]);
因为您仅在适配器加载第一个项目时设置文本和图像(接下来的项目将重新使用支架)