SimpleAdapter 顾名思义,简单的数据适配器,被用来做简单的数据展示,它可以将静态数据映射到XML定义好的视图上。先看构造函数:
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
第一个参数是上下文,第二个参数是由Map组成的数据集合,第三个参数是布局文件的资源id,第四个参数是数据源的key值集合,对应第二个参数里面map的键名称,第五个参数是要映射的视图资源id。
看完构造函数就大概知道SimpleAdapter的使用场景和使用方法了。接下来通过源码看一下视图绑定过程.
final Map dataSet = mData.get(position);// 找到对应的position位置的map数据
//将外部实现的绑定传入,SimpleAdapter能够实现
checkBox,CheckedTextView,TextView
,ImageView
final ViewBinder binder = mViewBinder;
final String[] from = mFrom;
final int[] to = mTo;
final int count = to.length;
//循环找控件,然后取到值赋给相应控件
for (int i = 0; i < count; i++) {
final View v = view.findViewById(to[i]);
if (v != null) {
final Object data = dataSet.get(from[i]);
String text = data == null ? "" : data.toString();
if (text == null) {
text = "";
}
boolean bound = false;
if (binder != null) {
bound = binder.setViewValue(v, data, text);
}
//如果满足if (!bound)那么bound就还是false,说明是普通数据
if (!bound) {
//查看v是不是Checkable的实例化类型,满足的情况可能是CheckBox,CheckedTextView
if (v instanceof Checkable) {
//如果数据类型是boolean,那么就是CheckBox
if (data instanceof Boolean) {
((Checkable) v).setChecked((Boolean) data);
//如果不是CheckBox,那么判断是不是继承 TextView的CheckedTextView,是的话赋值,不是就抛出异常
} else if (v instanceof TextView) {
setViewText((TextView) v, text);
} else {
throw new IllegalStateException(
);
}
//如果不是Checkable的实例化类型,判断是不是TextView的实例化类型
} else if (v instanceof TextView) {
setViewText((TextView) v, text){
//都不是以上情况,就判断一下是不是ImageView的实例化类型
} else if (v instanceof ImageView) {
//这里只满足数据类型为int也就是R.drawable.ic,和String类型的url,如果想实现直接用drawbale,就要实现ViewBinder
if (data instanceof Integer) {
setViewImage((ImageView) v, (Integer) data);
} else {
setViewImage((ImageView) v, text);
}
}
}