在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; }