适配器与ViewHolder - 循环

时间:2014-11-11 07:59:25

标签: android listview android-listview android-viewholder

我的自定义ListView适配器有问题。我想使用ViewHodler(因为我的listview有100多个元素),但是当我使用我的代码时,我的listview循环。通过循环我的意思是它只显示初始位置并循环它们的外观直到listview的结尾。我在本网站上提出建议: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并且它可以工作,但是根据这个网站我做错了...你也可以给我任何提示如何制作listview&#34;无滞后&#34;?提前谢谢。

1 个答案:

答案 0 :(得分: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]);

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