ListView和GridView多次調(diào)用getView的bug译株,導(dǎo)致賦值錯(cuò)位
最近總遇到寫GridView適配器賦值時(shí)瓜喇,最后一兩個(gè)需定義其他圖片時(shí),賦圖錯(cuò)誤歉糜,原因就是適配器的getView多次調(diào)用乘寒,導(dǎo)致數(shù)據(jù)賦值錯(cuò)誤,上網(wǎng)搜索終于找到解決方案匪补,以此記錄下伞辛。
一.ListView
1.原因
因?yàn)閘istView一般用的是wrap_content,高度不確定夯缺,導(dǎo)致系統(tǒng)需要不斷地測量蚤氏,也就多次調(diào)用onMeasure方法,所以就多次調(diào)用getView踊兜。
2.解決
很簡單竿滨,把寬高寫死即可(明確給個(gè)數(shù)字或者match_parent)
二.GridView
1.原因
不管高度和寬度寫死與否都會多次調(diào)用getView,原因有待繼續(xù)探索,姐呐。。典蝌。曙砂。
2.解決
無法阻止多次調(diào)用getView,只能在onMeasure調(diào)用getView的時(shí)候不要去對convertView做賦值的操作骏掀,只有當(dāng)onLayout的時(shí)候再對ConvertView進(jìn)行操作鸠澈。
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調(diào)用的就立即返回
return convertView;
}
System.out.println("xcqw getView 2***position"+position);
String content = contentList.get(position);
holder.tvContent.setText(content);
//如果不是onMeasure調(diào)用的就可以正常操作了
//賦值操作
return convertView;
}
這樣就ok了。