ListView的setViewBinder讲解

1:  这篇文章讲解的很透彻:http://blog.csdn.net/oHeHeHou/article/details/12205909

我的理解:

       (1)ListView通过setViewBinder设置好ViewBinder以后,viewBinder其实是放在默认的处理之前的:

    private void bindView(int position, View view) {
        final Map dataSet = mData.get(position);
        if (dataSet == null) {
            return;
        }

        final ViewBinder binder = mViewBinder;
        final String[] from = mFrom;
        final int[] to = mTo;
        final int count = to.length;

        for (int i = 0; i < count; i++) {
            //遍历item中的每个view对象
            final View v = view.findViewById(to[i]);
            if (v != null) {
                /*根据传入的String数组包含的key,去map里取值,toString()返回一个字符串,这个字符串在下面调用setViewValue时当做第三个参数传入
                  setViewValue的第三个参数在API中的描述为:
                  a safe String representation of the supplied data: it is either the result of data.toString()
                   or an empty String but it is never null
                 */
                final Object data = dataSet.get(from[i]);
                String text = data == null ? "" : data.toString();
                if (text == null) {
                    text = "";
                }
                /*bound  这个变量很关键,它依赖于ViewBinder的实例binder.setViewValue的返回值,item中每个view对象如何渲染取决于bound的值
                setViewValue返回true,即bound为true的话,表明item中每个view对象的渲染已经在setViewValue方法中处理完毕了,
                                如果setViewValue返回false,则使用默认的渲染方法
                */
                boolean bound = false;
                if (binder != null) {
                    bound = binder.setViewValue(v, data, text);
                }
                //setViewValue返回false,使用默认的渲染方法
                if (!bound) {
                    //如果类型是CheckBox,RadioButton, ToggleButton等或者是实现了Checkable接口的文本控件,根据map中的值设置选中状态
                    if (v instanceof Checkable) {
                        if (data instanceof Boolean) {
                            ((Checkable) v).setChecked((Boolean) data);
                        } else if (v instanceof TextView) {
                            // Note: keep the instanceof TextView check at the bottom of these
                            // ifs since a lot of views are TextViews (e.g. CheckBoxes).
                            setViewText((TextView) v, text);
                        } else {
                            throw new IllegalStateException(v.getClass().getName() +
                                    " should be bound to a Boolean, not a " +
                                    (data == null ? "<unknown type>" : data.getClass()));
                        }
                    } 
                   //如果是TextView
                   else if (v instanceof TextView) {
                        // Note: keep the instanceof TextView check at the bottom of these
                        // ifs since a lot of views are TextViews (e.g. CheckBoxes).
                        setViewText((TextView) v, text);
                    }
                    //如果是图片 
                   else if (v instanceof ImageView) {
                        if (data instanceof Integer) {
                            setViewImage((ImageView) v, (Integer) data);                            
                        } else {
                            setViewImage((ImageView) v, text);
                        }
                    } else {
                        throw new IllegalStateException(v.getClass().getName() + " is not a " +
                                " view that can be bounds by this SimpleAdapter");
                    }
                }
            }
        }
    }
从上面的代码可以看出,setViewBinder(v,data,text)为对应的view设置相应的data,

这个设置是在默认的设置之前的,如果setViewBinder返回值为false,那么默认设置有效;否者默认设置被屏蔽。

所以如果要加入特别的设置(比如点击事件等等)可以放在setViewBinder里面去实现。再用返回值控制默认设置是否有效。

2: 这篇文章也不错:http://www.cnblogs.com/zhangs1986/p/3612647.html

新的理解:SimpleAdapter里面的数据绑定,功能太过于简单,对于ImageView控件,默认只能调用setViewImage((ImageView)v,(Integer)data);以及setViewImage(((ImageView)v,text);,如果想设置一张图片的话,默认的处理是不支持的,默认的处理只能设置数字或者字符串(数字就是本地的资源id,R.drawable.pic这样的资源文件id,或者String字符串),如果是网络图片,也即非本地图片,此时默认的处理就无法满足要去了。如果需要有高级的设置,那么就必须在ViewBinder里面去设置了。ViewBinder其实就是有用户来接管v的处理。



;