带ViewHolder的适配器-循环

问题描述 投票:0回答:1

我的自定义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,并且它可以正常工作,但是根据此站点,我做错了...也可以给我一些技巧,以使列表视图“无滞后”吗?

android listview android-listview android-viewholder
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]);

因为您仅在适配器加载第一个项目时设置文本和图像(接下来的项目将重新使用支架)

© www.soinside.com 2019 - 2024. All rights reserved.