0

我的自定义 ListView 适配器有问题。我想使用 ViewHolder(因为我的列表视图有 100 多个元素),但是当我使用我的代码时我的列表视图会循环。通过循环我的意思是它只显示初始位置并循环它们的外观直到列表视图结束。我从这个网站建议:点击

这是我的代码:

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 并且它可以工作,但是根据这个站点我做错了......你还能给我任何提示如何使列表视图“无延迟”吗?

4

1 回答 1

0

试试这个 :

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]);

因为您只在适配器加载第一项时设置文本和图像(下一项将重新使用持有人)

于 2014-11-11T08:04:05.013 回答