您好,登錄后才能下訂單哦!
小編給大家分享一下Android 中ListView和GridView賦值錯位怎么辦,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
ListView和GridView多次調(diào)用getView的bug,導(dǎo)致賦值錯位
最近總遇到寫GridView適配器賦值時,最后一兩個需定義其他圖片時,賦圖錯誤,原因就是適配器的getView多次調(diào)用,導(dǎo)致數(shù)據(jù)賦值錯誤,上網(wǎng)搜索終于找到解決方案,以此記錄下。
一.ListView
1.原因
因?yàn)閘istView一般用的是wrap_content,高度不確定,導(dǎo)致系統(tǒng)需要不斷地測量,也就多次調(diào)用onMeasure方法,所以就多次調(diào)用getView。
2.解決
很簡單,把寬高寫死即可(明確給個數(shù)字或者match_parent)
二.GridView
1.原因
不管高度和寬度寫死與否都會多次調(diào)用getView,原因有待繼續(xù)探索,。。。。
2.解決
無法阻止多次調(diào)用getView,只能在onMeasure調(diào)用getView的時候不要去對convertView做賦值的操作,只有當(dāng)onLayout的時候再對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了。
看完了這篇文章,相信你對“Android 中ListView和GridView賦值錯位怎么辦”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。