对于一个Android项目中,会用到很多类型的adapter,(大部分都是继承BaseAdapter)但是每次构建都是一个很耗时间的事情,所以我们就想是不是可以利用一个abstract类MyBaseAdapter进行对baseAdapter进行继承,在这个类中重写一些公有的方法,对于每次构建一个实体adapter的话,可以直接继承MyBaseAdapter。
这就可以节省很多的代码了。
实现如下
1)构建MybaseAdapter
public static abstract class MybaseAdapter<T> extends BaseAdapter{ //note :在构建MybaseAdapter的时候,用到泛型,用到泛型的好处就是,在构建MybaseAdapter的时候就需要指定 自定义的adapter是处理什么类型的数据,就不用再MybaseAdapter中进行判断和处理,
Context context;//上下文对象,对于想调用系统中的方法,可以利用context处理
List<T> datasource; //需要处理的数据源
LayoutInflater inflater;//对于指定的布局文件,可以膨胀对于的布局
//下面是对context,和inflater处理的构造函数,同时对inflater进行赋值(利用context调用体统中的LAYOUT_INFLATER_SERVICE)
public MyBaseAdapter(Context context, List<T> datasource) {
super();
this.context = context;
this.datasource = datasource;
this.inflater=(LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
}
============================================================
以上是对MyBaseAdapter的准备工作
接下来就是重写BaseAdaper中的方法
@Override
public int getCount() {
return datasource.size();
}
@Override
public T getItem(int position) {
return datasource.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getItemView(position, convertView, parent);
}
note:对于getCount(),getItem(),getItemId()处理方式都是和一般继承BaseAdapter的方式是一样的
但是对于getView()就不一样了,由于对于getView()是依赖具体的item_layout(布局文件,也就是需要整体呈现的数据集合)
=========================================================================
对于这种处理方式其实有两种,但是由于对于要使用本类来处理数据的用户来说,可以利用一个abstract 方法来强制重写这个方法
public abstract View getItemView(int position, View convertView, ViewGroup parent);
note:这个abstract方法在继承中构建item_布局,同时在继承类中实现了这个方法后,在getItem()中进行调用,这就间接的将item_layout的构建给具体化了。
========================================================================================
对于一些数据比较多的应用来说,需要异步(asyncGetAllXxxxs),这就需要在方法中利用监听对数据进行返回,这就需要用到
public void addAll(List<T> list,boolean flag){
if(flag){
datasource.clear();//对原有的数据进行清除
}
datasource.addAll(list);//这是调用List中的addAll()
notifyDataSetChanged();//通知adapter数据发生变化,需要更新
}
对于在实现类中处理数据的话,利用异步加载,同时根据监听返回数据,可以用adapter.addAll()
例如:private void refresh() {
biz.asyncGetAllCalllogs(new OnLoadCallLogFinishListener() {
public void onLoadFinish(List<Calllog> calllogs) {
adapter.addAll(calllogs, true);
}
});
}
note:同时这个方法时在onResume()中进行调用
@Override
public void onResume() {
super.onResume();
refresh();
}
============================================================
同理:如果涉及到删除操作的话,可以写一个删除的方法
public void remove(T t){
datasource.remove(t);
notifyDataSetChanged();
}
=====================================================================
}