您的位置:首页 > 其它

万能适配器和万能ViewHolder配合实现ListView列表数据展示

2016-09-29 10:30 591 查看
在适配器的getView方法中使用ViewHolder来保存子布局项的组件信息时,传统的做法是:

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.listview_item,parent,false);
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.content = (TextView) convertView.findViewById(R.id.content);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(mDatas.get(position).getTitle());
holder.content.setText(mDatas.get(position).getContent());
return convertView;
}
class ViewHolder{
private TextView title;
private TextView content;
}


在项目开发中需要编写很多个适配器,那么会有很多重复的代码,若使用万能ViewHolder和万能适配器将会减少很多代码,使用方法见下:

1.  编写万能ViewHolder:

public class CommonViewHolder {
private int mPosition;
//  mViews用于存放界面上的组件
private SparseArray<View> mViews;
private View mCconvertView;
public CommonViewHolder(Context context, ViewGroup parent,int layoutId,int position){
this.mPosition = position;
this.mViews = new SparseArray<>();
this.mCconvertView = LayoutInflater.from(context).inflate(layoutId,parent,false);
mCconvertView.setTag(this);
}
// 获取ViewHolder
public static CommonViewHolder getViewHolder(Context context, View convertView,
ViewGroup parent, int layoutId, int position){
CommonViewHolder holder;
if(convertView == null){
holder = new CommonViewHolder(context,parent,layoutId,position);
}else{
holder = (CommonViewHolder)convertView.getTag();
holder.mPosition = position;
}
return holder;
}
//  获取convertView
public View getConvertView(){
return mCconvertView;
}
//  用来获取convertview中的组件  组件存在SparseArray中
public View getView(int viewId){
View view = mViews.get(viewId);
if(view == null){
view = mCconvertView.findViewById(viewId);
mViews.put(viewId,view);
}
return view;
}
}

2.  编写万能BaseAdapter适配器代码如下:

public abstract class CommonAdapter<T> extends BaseAdapter{
//  定义这两个属性为protected,是为了让子类能够访问
protected Context mContext;
protected List<T> mDatas;
public CommonAdapter(Context context,List<T> datas){
this.mContext = context;
this.mDatas = datas;
}
@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 abstract View getView(int position, View convertView, ViewGroup parent);
}

在具体实现适配器时,只需要new一个适配器并且继承CommonAdapter,然后在方法getView中具体去实现代码即可,示例如下:

public class MyBaseAdapter extends CommonAdapter{

public MyBaseAdapter(Context context, List datas) {
super(context, datas);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
CommonViewHolder holder  = CommonViewHolder.getViewHolder(mContext,convertView,  //  此处使用了万能ViewHolder
parent, R.layout.listview_item,position);
Bean bean = (Bean) mDatas.get(position);
TextView tv1 = (TextView) holder.getView(R.id.title);
tv1.setText(bean.getTitle());
TextView tv2 = (TextView) holder.getView(R.id.content);
tv2.setText(bean.getTitle());
TextView tv3 = (TextView) holder.getView(R.id.time);
tv3.setText(bean.getTitle());
TextView tv4 = (TextView) holder.getView(R.id.tel);
tv4.setText(bean.getTitle());
return holder.getConvertView();
}
}


这样我们若想再需要BaseAdapter适配器时,也只需要建立自己的Adapter继承CommonAdapter即可,只要在自己定义的Adapter中实现geView方法,不需要每次都去写ViewHolder和BaseAdapter中那些冗余的代码

Activity中只需要调用下面2行代码即可:

MyBaseAdapter adapter = new MyBaseAdapter(MainActivity.this,beanList);
listView.setAdapter(adapter);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ViewHolder BaseAdapter