android expandlistview group imageview報錯的解決辦法

在expandListView的group中如果包含imageview發現,報錯。提示無法將imageview轉換成TextView.查看源碼發現,SimpleExpandableListAdapter中有如下方法:

 

private void bindView(View view, Map data, String[] from, int[] to) {
        int len = to.length;
 
        for (int i = 0; i < len; i++) {
            TextView v = (TextView)view.findViewById(to[i]);
            if (v != null) {
                v.setText((String)data.get(from[i]));
            }
        }
    }

可以看出bindView把所有view都當textView來處理瞭。真是完全沒有老大哥simpleAdapter的防范,可以自動判斷類型綁定。網上普遍給出的方法是重寫bindView方法:

 

 

public class MyExpandableListAdapter extends BaseExpandableListAdapter{
        private void bindView(View view, Map data, String[] from, int[] to) {
                int len = to.length;
                boolean isBound = false;
                for (int i = 0; i < len; i++) {
                   final View v = view.findViewById(to[i]);
                 if (v!=null) {
                final Object _data = data.get(from[i]);
                String text = _data == null ? "" : data.toString();
                if (text == null) {
                    text = "";
                }
                          if (mViewBinder != null) {//如果Binder不為空,使用Binder進行處理
                                        isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);
                                }
                                if (!isBound) {//如果Binder跳過,使用原來的方法進行處理
                                        TextView _v = (TextView)v;
                                        _v.setText((String)data.get(from[i]));
                                }                               
                        }
                }
        }
}

不過對於我來說,盡量不重寫SDK沒有建議你復寫的方法,因為復寫之後性能和安全很難保證,最好能讓原SDK去處理。繼續查看源代碼,發現當我們返回的類型不是一個view類型,而是一個確切的佈局類型時,sdk就能識別,並不再當TEXTview處理,所以我的處理方案是將convertview轉換成我那個layout文件的佈局類型:

 

 

  @Override
	        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
	        	  ItemViewHolder holder = null;
		           if(convertView == null){
		        	   holder=new ItemViewHolder();
		        	   convertView = inflater.inflate(R.layout.down_exam_vitem, null); 
		        	   holder.itemImg = (ImageView)convertView.findViewById(R.id.exam_vitem_img);
		        	   convertView.setTag(holder);
		           }else{
						holder = (ItemViewHolder)convertView.getTag();
		           }
		           itemView = (RelativeLayout)convertView;
		           return itemView;
	        }

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。