一般不优化的adapter通常继承自BaseAdapter会出现一下几个问题:
- getCount(), getItem(), getItemId()代码都要去重写,一个adapter还行,如果adapter越来越多的话,每个adapter都这么写就超级恶心了。
- 就是getview里面if else 对convertview的判断的代码也是每个adapter都要去写,超级恶心。
- 然后就是如果优化adapter的findviewByid的加载,肯定要使用viewholder,那么每个adapter里面都写viewholder,恶心。
那么如何解决这问题呢:
- 首先就是getcount,getitem(),getitemId的代码最好在父类去实现,子类继承,就能让子类继承这些方法,而不用去多余写这些代码,实现代码重用。
- 考虑业务需求,如果有下拉刷新,上拉加载更多的操作,肯定有刷新adapter中list数据,也坑定有加载更多的方法,写到每个adapter里面既不美观,代码里面总是要带个notifydatesetchange的代码,恶心,因此这些操作可以封装到父类中去,比如如下的updateListview,addBottom操作。
- 对getview里面对viewholder以及频繁的findviewByd进行简化操作,封装到如下的viewholder类里面去,其中getViewHolder()方法简化了每个adapter的判断convertview是否为null以及settag的操作,getView()简化findviewByid的操作。
public abstract class EasyAdapter<T> extends BaseAdapter {
private LayoutInflater inflater;
private int layoutId;
private List<T> mlist = new ArrayList<T>(); public EasyAdapter(Context context, int layoutId, List<T> list) {
super();
this.inflater = LayoutInflater.from(context);
this.layoutId = layoutId;
this.mlist = list;
} /**
* 往顶部添加数据
*
* @param list
*/
public void add2Head(List<T> list) {
mlist.addAll(0, list);
notifyDataSetChanged();
} public void clearAll() {
mlist.clear();
notifyDataSetChanged();
} public List<T> getAllList() {
return mlist;
} /**
* 往底部添加数据
*
* @param list
*/
public void add2Bottom(List<T> list) {
mlist.addAll(list);
notifyDataSetChanged();
} public void add2Bottom(T t) {
mlist.add(t);
notifyDataSetChanged();
} /**
* @Title: updateListView
* @Description: TODO(更新BaseAdapter中的数据)
* @param @param list 设定文件
* @return void 返回类型
* @throws
*/
public void updateListView(List<T> list) {
mlist = list;
notifyDataSetChanged();
} @Override
public int getCount() {
return mlist.size();
} @Override
public T getItem(int position) {
return mlist.get(position);
} @Override
public long getItemId(int position) { return position;
} /**
* 实际显示View的方法,使用抽象方法强制调用者覆写!
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = ViewHolder.getViewHolder(parent, convertView,
inflater, layoutId);
convert(viewHolder, mlist.get(position));
return viewHolder.getConvertView(); } public abstract void convert(ViewHolder viewHolder, T t); }
ViewHolder 的封装:
public class ViewHolder {
private SparseArray<View> views;
private View convertView; public ViewHolder(ViewGroup parent,LayoutInflater inflater,int layoutId) {
this.views = new SparseArray<View>();
this.convertView = inflater.inflate(layoutId,parent,false);
this.convertView.setTag(this);
} /**
* 得到viewHolder
* @param parent
* @param convertView
* @param inflater
* @param layoutId
* @return
*/
public static ViewHolder getViewHolder(ViewGroup parent,View convertView,LayoutInflater inflater,int layoutId){
if (convertView==null){
return new ViewHolder(parent,inflater,layoutId);
}
return (ViewHolder) convertView.getTag();
} /**
* 得到convertView
* @return
*/
public View getConvertView() {
return convertView;
} /**
* 根据Id得到view
* @param viewId
* @param <T>
* @return
*/
public <T extends View>T getView(int viewId){
View view = views.get(viewId);
if (view==null){
view = convertView.findViewById(viewId);
views.put(viewId,view);
}
return (T) view;
} /**
* 根据id得到TextView
* @return
*/
public TextView getTextView(int viewId){
return getView(viewId);
}
/**
* 根据id得到ImageView
* @return
*/
public ImageView getImageView(int viewId){
return getView(viewId);
}
/**
* 根据id得到Button
* @return
*/
public Button getButton(int viewId){
return getView(viewId);
}
/**
* 根据id得到RadioButton
* @return
*/
public RadioButton getRadioButton(int viewId){
return getView(viewId);
}
/**
* 根据id得到CheckBox
* @return
*/
public CheckBox getCheckBox(int viewId){
return getView(viewId);
}
/**
* 根据id得到ImageButton
* @return
*/
public ImageButton getImageButton(int viewId){
return getView(viewId);
}
/**
* 根据id得到ImageButton
* @return
*/
public EditText getEditText(int viewId){
return getView(viewId);
} /**
* 根据id得到RelativeLayout
* @return
*/
public RelativeLayout getRelativeLayout(int viewId){
return getView(viewId);
}
}
下面是在项目中的使用,可见效果是如此的简洁和高效:
public class MainAdapter extends EasyAdapter<MainBean> { public MainAdapter(Context context, int layoutId, List<MainBean> list) {
super(context, layoutId, list);
} @Override
public void convert(ViewHolder viewHolder, MainBean t) {
ImageView imageView = viewHolder.getImageView(R.id.imageview);
TextView textView = viewHolder.getTextView(R.id.textView);
ImageLoader.getInstance().displayImage(t.getImageUrl(), imageView);
textView.setText(t.getContent());
}
}