SimpleAdapter继承了BaseAdapter,作为一个Adapter的简单实现,SimpleAdapter支持的控件也比较少:checkable控件(例如checkbox,radioButton)、TextView和ImageView。
源码路径:framework\base\core\java\android\widget\SimpleAdapter.java
package android.widget;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.net.Uri;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* SimpleAdapter是一个将静态数据映射到在xml中定义的View上的简单的adapter。
* 开发者将数据保存在一个包含maps的ArrayList中。Arraylist中的每一项数据和view
* 中的每一个项对应。map中包含了view中每一行的数据。同样,开发者可以指定xml文件
* 来显示map中对应行的数据或者用map中的keys值来指定view。
*
* 数据的绑定发生在一下两种情况。
* 首先,如果{@link android.widget.SimpleAdapter.ViewBinder} 可见,
* {@link ViewBinder#setViewValue(android.view.View, Object, String)}被调用。
* 如果setViewValue返回true,那么则进行数据绑定。如果返回false,那么下面这些
* 情况将按顺序尝试执行
*
* - 如果View实现了Checkable(例如Checkbox),那么返回值将是boolean类型
*
- TextView 返回值为String并且 {@link #setViewText(TextView, String)}将被调用
*
- ImageView 返回值为资源id或者string,并且{@link #setViewImage(ImageView, int)}
* 或者 {@link #setViewImage(ImageView, String)} 被调用
*
* 如果没有合适的binding返回,将会抛出 {@link IllegalStateException}异常
*/
public class SimpleAdapter extends BaseAdapter implements Filterable {
private int[] mTo;
private String[] mFrom;
private ViewBinder mViewBinder;
private List extends Map> mData;
private int mResource;
private int mDropDownResource;
private LayoutInflater mInflater;
private SimpleFilter mFilter;
private ArrayList
list_item.xml
SimpleAdapter中包含了一个Interface ViewBinder,这里分两种情况,分别介绍两个事例,第一个,不使用ViewBinder;第二个,使用ViewBinder
SimpleAdapterNoBinder.javapackage com.lj.simpleadaptertest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class SimpleAdapterNoBinder extends Activity {
ListView mListView;
List> mData = new ArrayList>();
public static final String KEY_IMG = "imgage";
public static final String KEY_TITLE = "title";
public static final String KEY_SUMMARY = "summary";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_no_binder);
mListView = (ListView) findViewById(R.id.list_no_binder);
//定义一个mAdapter,设置自定义的layout布局,调用getData返回需要显示的数据
SimpleAdapter mAdapter = new SimpleAdapter(this, getData(),
R.layout.list_item, new String[] { KEY_IMG, KEY_TITLE,
KEY_SUMMARY, }, new int[] { R.id.image, R.id.title,
R.id.summary });
mListView.setAdapter(mAdapter);
}
//map中包含三部分数据,ImageView设置为默认的R.drawable.ic_launcher,两个TextView设置为随机的字符
private List> getData() {
List> list = new ArrayList>();
Map map;
for (int i = 0; i < 30; i++) {
map = new HashMap();
map.put(KEY_IMG, R.drawable.ic_launcher);
map.put(KEY_TITLE, getTitleText(8));
map.put(KEY_SUMMARY, getTitleText(10));
list.add(map);
}
return list;
}
private Object getTitleText(int length) {
String mString = "qwertyuiopasdfghjklzxcvbnm";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(mString.length());
sb.append(mString.charAt(number));
}
return sb.toString();
}
}
SimpleAdapterWithBinder.java
package com.lj.simpleadaptertest;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class SimpleAdapterWithBinder extends Activity {
ListView mListView;
List> mData = new ArrayList>();
public static final String KEY_IMG = "imgage";
public static final String KEY_TITLE = "title";
public static final String KEY_SUMMARY = "summary";
public static final String KEY_CHECK = "check";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_no_binder);
mListView = (ListView) findViewById(R.id.list_no_binder);
SimpleAdapter mAdapter = new SimpleAdapter(this, getData(),
R.layout.list_item, new String[] { KEY_IMG, KEY_TITLE,
KEY_SUMMARY, }, new int[] { R.id.image, R.id.title,
R.id.summary });
mAdapter.setViewBinder(new TestViewBinder());
mListView.setAdapter(mAdapter);
}
private List> getData() {
List> list = new ArrayList>();
Map map;
for (int i = 0; i < 30; i++) {
map = new HashMap();
map.put(KEY_IMG, R.drawable.ic_launcher);
map.put(KEY_TITLE, getTitleText(8));
map.put(KEY_SUMMARY, getTitleText(10));
map.put(KEY_CHECK, (i / 2 == 0 ? true : false));
list.add(map);
}
return list;
}
private Object getTitleText(int length) {
String mString = "qwertyuiopasdfghjklzxcvbnm";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(mString.length());
sb.append(mString.charAt(number));
}
return sb.toString();
}
public Bitmap getBitmap(final String url) {
Log.e("lijian", "url = " + url);
Bitmap bmp = null;
try {
URL mUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) mUrl.openConnection();
InputStream is = conn.getInputStream();
bmp = BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
}
return bmp;
}
/**
* 实现ViewBinder接口
*
*/
class TestViewBinder implements SimpleAdapter.ViewBinder {
@Override
public boolean setViewValue(View view, Object data,
String textRepresentation) {
if ((view instanceof ImageView)) {
Log.e("lijian", "set internet image data " + data);
ImageView mImageView = (ImageView) view;
mImageView.setImageResource(R.drawable.error);
return true;
} else if (view instanceof TextView && view.getId() ==R.id.summary) {
TextView mTextView = (TextView) view;
mTextView.setText("你好");
return true;
}
return false;
}
}
}
效果图:
图 1
图二
图片以和图片二分别代表不使用ViewBinder和使用ViewBinder的结果,每一个Item的图片和summary字符可以在ViewBinder实现的类中的setViewValue中修改。
源码下载