ListView 通用Adapter封装
新项目中需要很多的ListView进行数据展示,就有了封装一个通用Adapter的想法 ,先放代码:
- MBaseAdapter.java
/**
*
* 通用的适配器
*/
public abstract class MBaseAdapter<T> extends BaseAdapter {
private List<T> list;
private Context context;
private int resId;
/**
* @param list :数据源
* @param context :上下问关联
* @param resId :对应的item 布局文件
*
*/
public MBaseAdapter(List<T> list, Context context, int resId) {
this.context = context;
this.list = list;
this.resId = resId;
}
@Override
public int getCount() {
if (list != null) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MViewHolder viewHolder = MViewHolder.getViewHolder(convertView, context, resId);
setData(viewHolder, position);
return viewHolder.getmConverView();
}
/**
* 为布局文件添加数据,在Activity页面进行重写
*/
public abstract void setData(MViewHolder myViewHolder, int position);
}
- MViewHolder.java
/**
* 获取viewhoer对象
*/
public class MViewHolder {
private View mConverView;
private Context context;
private int resId;
public MViewHolder(Context context, int resId) {
this.context = context;
this.resId = resId;
mConverView = LayoutInflater.from(context).inflate(resId, null);//加载布局
mConverView.setTag(this);//设置tag为当前的hoder
}
public View getmConverView() {//获取返回的view
return mConverView;
}
/**
* 获取viewhoder对象
*
* @param convertView
* @param context
* @param resId
* @return
*/
public static MViewHolder getViewHolder(View convertView, Context context, int resId) {
MViewHolder myViewHolder;
if (convertView == null) {
myViewHolder = new MViewHolder(context, resId);
} else {
myViewHolder = (MViewHolder) convertView.getTag();
}
return myViewHolder;
}
/**
* 获取view
* @param id
* @return
*/
public <T extends View>T findView(int id) {
return (T)mConverView.findViewById(id);
}
}
使用示例
/**
* 给listview设置适配器
*/
private void setAdapter() {
lv.setAdapter(new MBaseAdapter<String>(list, myactivity.this,R.layout.item_listview) {
@Override
public void setData(MViewHolder myViewHolder, final int position) {
TextView textview = myViewHolder
.findView(R.id.tv_item_text);
textview.setText(list.get(position));
});
}