Android 带视窗支架的适配器-环路
我的自定义ListView适配器有问题。我想使用ViewHolder(因为我的listview有100多个元素),但我的listview在使用代码时会循环。通过循环,我的意思是它只显示初始位置并循环它们的外观,直到listview结束。我是从这个网站上建议的: 这是我的代码: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
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类设置为静态,请接受我的回答:)