小編給大家分享一下Android 中ListView和GridView賦值錯(cuò)位怎么辦,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需網(wǎng)站建設(shè),是成都網(wǎng)站推廣公司,為成都茶藝設(shè)計(jì)提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站推廣熱線:028-86922220
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了。
看完了這篇文章,相信你對“Android 中ListView和GridView賦值錯(cuò)位怎么辦”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!