欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 中ListView和GridView赋值错位

程序员文章站 2023-11-30 21:56:22
listview和gridview多次调用getview的bug,导致赋值错位 最近总遇到写gridview适配器赋值时,最后一两个需定义其他图片时,赋图错误,原因就...

listview和gridview多次调用getview的bug,导致赋值错位

最近总遇到写gridview适配器赋值时,最后一两个需定义其他图片时,赋图错误,原因就是适配器的getview多次调用,导致数据赋值错误,上网搜索终于找到解决方案,以此记录下。

一.listview

1.原因

因为listview一般用的是wrap_content,高度不确定,导致系统需要不断地测量,也就多次调用onmeasure方法,所以就多次调用getview。

2.解决

很简单,把宽高写死即可(明确给个数字或者match_parent)

二.gridview

1.原因

不管高度和宽度写死与否都会多次调用getview,原因有待继续探索,。。。。

2.解决

无法阻止多次调用getview,只能在onmeasure调用getview的时候不要去对convertview做赋值的操作,只有当onlayout的时候再对convertview进行操作。

1).自定义gridview:

mygridview.java

public class mygridview extends gridview {

public boolean isonmeasure;

public mygridview(context context) {

super(context);

}

public mygridview(context context, attributeset attrs) {

super(context, attrs);

}

public mygridview(context context, attributeset attrs, int defstyle) {

super(context, attrs, defstyle);

}

@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {

isonmeasure = true;

super.onmeasure(widthmeasurespec, heightmeasurespec);

}

@override

protected void onlayout(boolean changed, int l, int t, int r, int b) {

isonmeasure = false;

super.onlayout(changed, l, t, r, b);

}

}

2).getview中对convertview的处理

@override

public view getview(int position, view convertview, viewgroup parent) {

system.out.println("xcqw getview 1***position"+position);

viewholder holder = null;

if (convertview == null) {

convertview = inflater.inflate(r.layout.item,

parent, false);

holder = new viewholder();

holder.tvcontent = (textview) convertview.findviewbyid(r.id.tv_content);

convertview.settag(holder);

} else {

holder = (viewholder) convertview.gettag();

}

if(((mygridview) parent).isonmeasure){

//如果是onmeasure调用的就立即返回

return convertview;

}

system.out.println("xcqw getview 2***position"+position);

string content = contentlist.get(position);

holder.tvcontent.settext(content);

//如果不是onmeasure调用的就可以正常操作了

//赋值操作

return convertview;

}

这样就ok了。

如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!