android万能适配器之SuperAdapter

对于传统的Adapter的写法,相信大家都是很熟悉的,然而在一个大型的项目中,我们肯定不会每次都去继承BaseAdapter,这样会很大的增加我们的劳动量,这里给大家介绍一个比较牛的SuperAdapter


首先来看下SuperAdapter的源代码:

前两个是构造方法:没什么说的,
onCreate()方法去创建服用的ViewHolder



接下来看下BaseViewHolder.get()的方法:和传统的写法很类似了,

到这里了,我们索性看下BaseViewHolder的其他方法:在这里封装了类似

 public BaseViewHolder setText(int viewId, CharSequence value) {
        TextView view = getView(viewId);
        if (TextUtils.isEmpty(value))
            view.setText("");
        else
            view.setText(value);
        return this;
    }

    public BaseViewHolder setImageResource(int viewId, int imageResId) {
        ImageView view = getView(viewId);
        view.setImageResource(imageResId);
        return this;
    }
的很多的代码,用来传入item中的子view的id,和显示的资源来进行绑定

最后看下BaseSuperAdaper这个类 (它继承自底层的BaseAdapter实现的代码也是很简单的,平时我们都有用到)

public abstract class BaseSuperAdapter<T, H extends BaseViewHolder> extends BaseAdapter {

    protected Context mContext;
    protected int mLayoutResId;
    protected List<T> mList;
    protected IMultiItemViewType<T> mMultiItemViewType;

    public BaseSuperAdapter(Context context, List<T> data, int layoutResId) {
        this.mContext = context;
        this.mList = data == null ? new ArrayList<T>() : new ArrayList<>(data);
        this.mLayoutResId = layoutResId;
    }

    public BaseSuperAdapter(Context context, List<T> data, IMultiItemViewType<T> multiItemViewType) {
        this.mContext = context;
        this.mList = data == null ? new ArrayList<T>() : new ArrayList<>(data);
        this.mMultiItemViewType = multiItemViewType;
    }

    @Override
    public int getCount() {
        return mList == null ? 0 : mList.size();
    }

    @Override
    public T getItem(int position) {
        if (position >= mList.size())
            return null;
        return mList.get(position);
    }

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

    @Override
    public int getViewTypeCount() {
        if (mMultiItemViewType != null)
            return mMultiItemViewType.getViewTypeCount();
        return 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (mMultiItemViewType != null) {
            return mMultiItemViewType.getItemViewType(position, mList.get(position));
        }
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final H viewHolder = onCreate(getItemViewType(position), convertView, parent);
        T item = getItem(position);
        onBind(viewHolder, position, item);
        return viewHolder.getItemView();
    }

    protected abstract H onCreate(int viewType, View convertView, ViewGroup parent);

    /**
     * Abstract method for binding view and data.
     *
     * @param holder   ViewHolder
     * @param position position
     * @param item     data
     */
    protected abstract void onBind(H holder, int position, T item);

    public void add(T item) {
        mList.add(item);
        notifyDataSetChanged();
    }

    public void add(T item, boolean isChanged) {
        mList.add(item);
        if (isChanged)
            notifyDataSetChanged();
    }

    public void add(int index, T item) {
        mList.add(index, item);
        notifyDataSetChanged();
    }

    public void addAll(List<T> items) {
        mList.addAll(items);
        notifyDataSetChanged();
    }

    public void remove(T item) {
        mList.remove(item);
        notifyDataSetChanged();
    }

    public void remove(int index) {
        mList.remove(index);
        notifyDataSetChanged();
    }

    public void remove(int index, boolean isChange) {
        mList.remove(index);
        if (isChange)
            notifyDataSetChanged();
    }

    public void set(T oldItem, T newItem) {
        set(mList.indexOf(oldItem), newItem);
    }

    public void set(int index, T item) {
        mList.set(index, item);
        notifyDataSetChanged();
    }

    public void replaceAll(List<T> items) {
        mList.clear();
        addAll(items);
    }

    public boolean contains(T item) {
        return mList.contains(item);
    }

    public void clear() {
        mList.clear();
        notifyDataSetChanged();
    }

    public List<T> getAllData() {
        return mList;
    }

}


源码就这些了。具体用法:

(1)listView中的SingleItem(单布局)
     
	初始化:
	
       new ListSingleAdapter(getContext(), names, R.layout.item_type1)
 
(2)listView中的MultiItem(多布局)
	
	初始化:

其他的像GridView.RecyclerView的Adaper用法都是一样的
最后附上demo的下载地址:http://www.oschina.net/code/snippet_2702417_55790
eclispe源码:http://download.csdn.net/detail/u013424496/9506142

最新版的SuperAdapter:https://github.com/byteam/SuperAdapter

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值