通用适配器构建过程:
1、将共同的重写方法放抽象类中,如下面几个方法:
@Override public int getCount() { return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; }
2、getView方法中需要用到bean对象及holderView来初始化listView内容;所以通过抽象类中定义抽象方法、暴露出方法供具体实现:
public View getView(int position, View convertView, ViewGroup parent){ ViewHolder holder = ViewHolder.get(mContext, convertView, parent, layoutId, position); convert(holder,getItem(position)); return holder.getConvertView(); } public abstract void convert(ViewHolder holder,T t);
所以当我使用时、继承这个抽象类,只需要实现具体的convert方法。
@Override public void convert(ViewHolder holder, final Bean bean) { ((TextView)holder.getView(R.id.id_title)).setText(bean.getTitle()); ((TextView)holder.getView(R.id.id_desc)).setText(bean.getDesc()); ((TextView)holder.getView(R.id.id_time)).setText(bean.getTime()); ((TextView)holder.getView(R.id.id_phone)).setText(bean.getPhone()); final CheckBox checkBox = holder.getView(R.id.id_cb); checkBox.setChecked(bean.isChecked()); checkBox.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { bean.setChecked(checkBox.isChecked()); }}); }
而ViewHolder中的作用就是构建布局并加载内容以及返回listView中具体的view:
public static ViewHolder get(Context context,View converView,ViewGroup parent, int layoutId,int position){ if(converView == null){ return new ViewHolder(context,parent,layoutId,position); }else{ ViewHolder viewHolder = (ViewHolder)converView.getTag(); viewHolder.mPosition = position; return viewHolder; } } public View getConvertView() { return mConvertView; }
当然,我们还可以添加图片或请求服务器加载图片;这些方法在ViewHolder类中都有具体的实现方法。
public ViewHolder setImageBitmap(int viewId,Bitmap bitmap){ ImageView view = getView(viewId); view.setImageBitmap(bitmap); return this; } public ViewHolder setImageURI(int viewId,String URL){ ImageView view = getView(viewId); // Imageloader.getInstance().load(view,URL); return this; }
所以、以后在使用Adapter类时,我们只需要继承CommonAdapter类,并提供具体的实体;实现暴露给我们的抽象方法;便完成了适配器。
下面附源代码,供参考。