ListView 作为开发中出现频率很高的控件,项目中写的很多的就是ListView 的Adapter,但是很多情况下Adapter 中很多代码都是相同的,为了不再 CV大法,对ListView 的Adapter 进行封装
ListView 的通用适配器
未进行封装以前,一个ListView 或GridView 的Adapter 代码结构如下:
public class MyAdapter extends BaseAdapter
{
private LayoutInflater mInflater;
private Context mContext;
private List mDatas;
public MyAdapter(Context context, List mDatas)
{
mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mDatas = mDatas;
}
@Override
public int getCount()
{
return mDatas.size();
}
@Override
public Object getItem(int position)
{
return mDatas.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder = null;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.item_single_str, parent,
false);
viewHolder = new ViewHolder();
convertView.setTag(viewHolder);
} else
{
viewHolder = (ViewHolder) convertView.getTag();
}
// 绑定视图....
return convertView;
}
private final class ViewHolder
{
// your field
}
}
如果创建多个Adapter 多是重复书写的代码,需要进行封装
关于数据源 mDatas ,使用泛型声明 private List mDatas;
getCount() 、getItemId() 、getItem() 保持原本的实现方式
@Override
public int getCount() {
return mDatas == null ? 0 : mDatas.size();
}
@Override
public T getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
重点在于 getView()方法,这个方法的本意就是获取需要显示的视图,那就把视图的创建和绑定的职责交给ViewHolder来完成
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建ViewHolder 是否创建新的由ViewHolder 自身去决定
CommonViewHolder commonViewHolder = CommonViewHolder.getViewHolder(mContext, convertView, parent, mItemViewId, position);
//ViewHolder 进行绑定视图的操作
convert(commonViewHolder, getItem(position), position);
//返回需要显示的视图
return commonViewHolder.getConvertView();
}
ViewHolder
public static CommonViewHolder getViewHolder(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {//判断是否有可以复用的 convertView
return new CommonViewHolder(context, parent, layoutId, position);
}
return (CommonViewHolder) convertView.getTag();
}
private CommonViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
this.mViews = new SparseArray<>(); //用于保存convertView 需要操作的View
//渲染视图
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
//setTag 操作 以备复用
mConvertView.setTag(this);
this.mContext = context;
}
封装之后使用的方式
listView.setAdapter(new ListCommonAdapter(this, mDatas, R.layout.item_listview) {
@Override
protected void convert(CommonViewHolder commonViewHolder, TestBean item, int position) {
//commonView 中封装了一系列简单的视图操作,并且可以链式调用
commonViewHolder
.setImageResource(R.id.iv_icon, item.getImageId())
.setText(R.id.tv_content, item.getContent());
}
});