在上篇Android——ListView实现简单列表 中,利用SimpleAdapter实现了简单的列表绑定。在本文中,主要是通过重写getView方法,来看下adapter内部绑定数据大致是个什么流程。
首先加入实现类:
class mTestAdapter extends SimpleAdapter {
private Context context; /*运行环境*/
ArrayList<HashMap<String, String>> listItem; /*数据源*/
private LayoutInflater listContainer; // 视图容器
class ListItemView { // 自定义控件集合
public TextView txtName;
}
/*construction function*/
public mTestAdapter(Context context,
ArrayList<HashMap<String, String>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.listContainer = LayoutInflater.from(context); // 创建视图容器并设置上下文
this.context=context;
listItem=data;
}
/**
* @see android.widget.Adapter#getCount()
*/
public int getCount() {
return listItem.size();
}
/**
* @see android.widget.Adapter#getItem(int)
*/
public Object getItem(int position) {
return listItem.get(position);
}
/**
* @see android.widget.Adapter#getItemId(int)
*/
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int mPosition = position;
ListItemView listItemView = null;
if (convertView == null) {
convertView = listContainer.inflate(R.layout.listview_item, null);//加载布局
listItemView = new ListItemView();
/*初始化控件容器集合*/
listItemView.txtName=(TextView) convertView
.findViewById(R.id.name);
// 设置控件集到convertView
convertView.setTag(listItemView);
}else{
listItemView=(ListItemView)convertView.getTag();//利用缓存的View
}
/*
* PS:
* 这里放入对控件的属性及事件进行初始化设置的操作
* */
/*TextView设置点击事件*/
listItemView.txtName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "点击了"+mPosition, Toast.LENGTH_SHORT).show();
}
});
//设置text的值(用position标记来看的更清楚点儿)
listItemView.txtName.
setText(mPosition+" "+listItem.get(mPosition).get("ItemName"));
return convertView;
}
}
}
我们用这个实现类来取代我们之前用的SimpleAdapter.
mTestAdapter listItemAdapter=new mTestAdapter(getBaseContext(),/*指明了SimpleAdapter关联的View的运行环境,也就是当前的Activity*/
listItem,/*由Map组成的List,在List中的每条目对应ListView的一行,每一个Map中包含的就是所有在from参数中指定的key*/
R.layout.listview_item,/*定义列表项的布局文件的资源ID,该资源文件至少应该包含在to参数中定义的ID*/
new String[]{"ItemName"},/*将被添加到Map映射上的Key*/
new int[] {R.id.name}/*将绑定数据的视图的Id跟from参数对应,这些被绑定的视图元素应该全是TextView*/
);
//设置适配器
之后,run下,看看我们加的toast:
发现点击事件加上了,而且通过position,很容易区分我们当前到底操作的时候那个item,并可以针对这个Item进行有针对的操作。尤其是当item上面有button的时候,重写Adapter就显得比较简单了。