今天需要实现一个2级树,很不幸的是这颗2级树的Group,就是第一级上有个ImageView,我按照SimpleAdapter的套路把图片的id搞上去发现死活都在抛错:
12-04 06:09:36.228: ERROR/AndroidRuntime(324): java.lang.ClassCastException: android.widget.ImageView根据堆栈来看竟然是SimpleExpandableListAdapter内部出了错,错在转型上,于是跟进去,发现了这段代码:
private void bindView(View view, Map我靠,这个SimpleExpandableListAdapter也太Simple了吧,竟然吧所有的View都当做TextView来处理了,一点都没有他的兄弟SimpleAdapter的风范,想当年,SimpleAdapter可以自动判断View的类型,自动绑定,实在不得,还给你个ViewBinder...咋地名字差不多,但是能力差这么多捏...-_-|||... 不得,虽然这里可以不用ExList用ListView自己渲染也可以,但这回不得,下次还不是不得?诶,自己改造一个!,于是开工 这第一次我们简单点,就使用个ViewBinder回调一下就得了,下次再来弄自动绑定的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])); } } }
public class MyExpandableListAdapter extends BaseExpandableListAdapter{ private void bindView(View view, Mapdata, 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])); } } } } }
ok,Activity中在ViewBinder一下,这里不贴了,上图:
转载:http://www.adobex.com/android/source/details/00000438.htm