adapter的重用

  对于一个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();
    }

=====================================================================



}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值