Android 带视窗支架的适配器-环路

Android 带视窗支架的适配器-环路,android,listview,android-listview,android-viewholder,Android,Listview,Android Listview,Android Viewholder,我的自定义ListView适配器有问题。我想使用ViewHolder(因为我的listview有100多个元素),但我的listview在使用代码时会循环。通过循环,我的意思是它只显示初始位置并循环它们的外观,直到listview结束。我是从这个网站上建议的: 这是我的代码: public class ListList extends ArrayAdapter<String>{ private final String[] web; private final Integer[] i

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

这是我的代码:

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;
}
}
公共类列表扩展了ArrayAdapter{
私有最终字符串[]web;
私有最终整数[]imageId;
语境;
公共列表(上下文,
字符串[]web,整数[]imageId){
超级(上下文、R.layout.champion_列表、web);
this.context=上下文;
this.web=web;
this.imageId=imageId;
}
@凌驾
公共视图getView(内部位置、视图v、视图组父视图){
ViewHolder=新的ViewHolder();
如果(v==null){
LayoutFlater充气机=LayoutFlater.from(上下文);
v=充气机充气(R.layout.champion\u列表,空);
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[位置]);
v、 setTag(支架);
}
否则{
//查看回收!
//不需要充气
//不需要按id查找视图
holder=(ViewHolder)v.getTag();
}
返回v;
}
静态类视窗夹{
文本视图;
图像视图img;
}
}
知道我哪里做错了吗?我试着把.setText和.setImageResource从if语句中放出来,它是有效的,但根据这个网站,我做错了。。。您还可以给我一些如何使listview“无滞后”的提示吗?

试试这个:

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

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

ViewHolder与视图重用和适配器中的项目数无关通过显示初始位置,您的列表视图是否显示重复内容?很高兴知道。对不起,我正在学习ViewHolder和任何优化listview的东西。但ViewHolder不优化listview吗?@KalpeshPatel-这正是我的想法。看@Blaze Tama回答他纠正了你的错误。我以前做过,我知道这很有效,但这是否意味着我链接的网站上的家伙错了?@Darknez不,他们是对的。看看他们的代码,他们还设置了if-else之外的可见性(看看我的代码)。我只是想知道,因为我的车还是跟以前一样落后,所以我觉得我做错了什么。无论如何,谢谢您的回答。@Darknez ViewHolder用于提高性能。因为您没有执行
v.findviewbyd(R.id.txt)每次您要设置文本时
findViewById
在计算上非常昂贵,并且视图持有者直接持有对
textView
的引用,因此每次您要分配新值时,您都要保存
findViewById
调用。这同样适用于任何其他视图。@Darknez尝试将您的holder类设置为静态,请接受我的回答:)