Butterknife下的BaseAdapter封装。

现在做新项目,每次ListView或GridView用adapter的时候,都要写一大堆。于是我写了一个AdapterCopy的类,每次用的时候都全部复制过去。受够了这种复制粘贴,今天突发奇想,为什么不把Adapter封装一下,让它和封装后的Activity一样好用?

adapter设计思路(adapter理想模型):
1、getView() 。返回型为int,即和activity一样,只需要返回一个布局id。

 @Override
    protected int layoutInit() {
        return R.layout.activity_test;
    }

2、bindEvent(Holder holder,int position)。同activity一样,里面只需要处理相应逻辑,不同的是需要holder,position参数(adapter没有这两个参数没法玩啊)。

3、getHolder(View v)。主要用于返回holder类型。(理想模型没有这一方法。暂时没想到怎么去掉)

由于需要让adapter自动判断里面数据集合类型和Holder类型,所以必须要用到泛型。
贴代码:
AbstractAdapter:

/**
 * Hoyn
 * 第一个泛型为数据类型,第二个泛型为holder类型
 * Created by a on 2016/6/12.
 */
public abstract class AbstractAdapter<E, T extends BaseHolder> extends BaseAdapter {

    protected List<E> data = new ArrayList<E>();
    protected Context context;

    public AbstractAdapter() {
    }

    public AbstractAdapter(List<E> list) {
        this.data = list;
    }

    public List<E> getData() {
        return data;
    }

    public void setData(List<E> data) {
        this.data = data;
        notifyDataSetChanged();
    }

    /**
     * 增加全部list
     *
     * @param data
     */
    public void addDatas(List<E> data) {
        this.data.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 增加某个item
     *
     * @param data
     */
    public void addData(E data) {
        this.data.add(data);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 删除某项item
     *
     * @param position
     */
    public void delItem(int position) {
        if (data != null && data.size() > position) {
            data.remove(position);
            this.notifyDataSetChanged();
        }
    }

    /**
     * 删除全部
     */
    public void delAll() {
        data.clear();
        this.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        context = parent.getContext();
        T holder = null;
        if (convertView == null) {
            //getView()的抽象方法,返回值为int
            convertView = getItemView(getView(), parent);
            //通过泛型自动转换holder类型,由于butterknife需要在holder里面绑定控件,所以不能写成同一个holder,而需要自动转换。
            holder = getHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (T) convertView.getTag();
        }
        //逻辑处理的抽象方法
        bindEvent(holder,position);
        return convertView;
    }
    //三个抽象方法
    protected abstract T getHolder(View v);

    protected abstract int getView();

    protected abstract void bindEvent(T holder,int position);

    protected View getItemView(int id, ViewGroup parent) {
        return LayoutInflater.from(parent.getContext()).inflate(id, parent, false);
    }

}

BaseHolder:

/**
 * Hoyn
 * 很简单,只有butterknife基本功能
 * Created by a on 2016/6/12.
 */
public abstract  class BaseHolder {
    public BaseHolder(View view) {
        ButterKnife.bind(this, view);
    }
}

实现
TestAdapter:

/**
 * Hoyn
 * 本例的data为List<String>
 * Created by a on 2016/6/12.
 */
public class TestAdapter extends AbstractAdapter<String,TestAdapter.MyHolder> {

    @Override
    protected MyHolder getHolder(View v) {
        return new MyHolder(v);
    }

    @Override
    protected int getView() {
        return R.layout.item_test;
    }

    @Override
    protected void bindEvent(MyHolder holder,int position) {
        holder.tv.setText(data.get(position));
    }

    protected class MyHolder extends BaseHolder {
        @Bind(R.id.textView)
        TextView tv;
        public MyHolder(View view) {
            super(view);
        }
    }
}

怎么样,是不是看起来舒服多了?

 @Override
    protected MyHolder getHolder(View v) {
        return new MyHolder(v);
    }

如果能把这部分去掉就更舒服了,期待我以后的更新吧。

TestActivity:

/**
 * Created by a on 2016/6/12.
 */
public class TestActivity extends BaseActivity{
    @Bind(R.id.lv_test)
    ListView lv;
    TestAdapter adapter = new TestAdapter();
    @Override
    protected int layoutInit() {
        return R.layout.activity_test;
    }

    @Override
    protected void binEvent() {
        lv.setAdapter(adapter);
        monidata();
    }


    private void monidata(){
        List<String> data = new ArrayList<>();
        for (int a=0;a<20;a++){
            data.add("测试:"+a);
        }
        adapter.setData(data);
    }
}

效果图:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值