对于我们Android程序猿来说,listview算是最常见的控件之一了,当然listview是要和adapter配套使用的,下面我们就来看看常规的adapter操作
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.child_item, parent, false);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(list.get(position).getPName());
return convertView;
}
public static class ViewHolder {
public TextView title;
}
其他的方法就不说了,主要代码都是集中在getView方法中的,一个完整的项目里面应该也不会是只有一个listview和adapter,这样一来我们就需要重复性的写getview方法里面的代码,既然viewholder和findview,settag这些在adapter里面都要用到,我们能不能把这些都要用到的代码抽取出来呢?下面就说一下如何抽取。
@Override
public int getCount() {
return mList == null ? 0 : mList.size();
}
@Override
public T getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
下面就一步步教你如何写一个万能的适配器CommonAdapter
首先我们写一个类继承BaseAdapter
public class CommonAdapter<T> extends BaseAdapter
public CommonAdapter(Context context, List<T> list, int itemLayoutId) {
this.mItemLayoutId = itemLayoutId;
this.context = context;
this.mList = list;
this.mInflater = LayoutInflater.from(context);
}
在常规的操作中每个adapter我们需要一个ViewHolder,一个converView
接下来我们写一个ViewHolder
item中的控件可以是各种各样的,所以我们需要一个集合用来存放这些控件,考虑到效率问题,我们用SparseArray来存放这些组件
private CommonViewHolder(Context context) {
this.mViews = new SparseArray<View>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.child_item, parent, false);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(list.get(position).getPName());
return convertView;
}
可以看到,我们需要三个参数,第一个是布局文件id,第二个是getview中的ViewGroup,第三个可以不用去管,
所以在我们的CommonViewHolder中就需要这些参数,我们将构造方法改成
private CommonViewHolder(Context context, ViewGroup parent, int layoutId) {
this.mViews = new SparseArray<View>();
this.mConverView = LayoutInflater.from(context).inflate(layoutId,
parent, false);
this.mConverView.setTag(this);
}
这样一来我们就可以获取item的布局文件,接下来就是拿到item中的组件,并保存到集合中
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConverView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public CommonViewHolder setText(int viewId, String text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
接下来就是getview方法了
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CommonViewHolder viewHolder = CommonViewHolder.get(context,
convertView, parent, mItemLayoutId, position);
convert(viewHolder, position, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convert(CommonViewHolder holder, int position, T item);
下面有demo的链接地址,大家可以下下来参考一下
Demo <a target=_blank href="http://download.csdn.net/detail/wrm0013/9001377">点击打开链接</a>