万能RecyclerView 的BaseAdapter

来源:互联网 发布:单片机串口通信模块 编辑:程序博客网 时间:2024/05/08 02:47

最近公司开始使用RecyclerView,研究了一下,一看什么都得需要自定义,不过使用起来确实强大,自定义方便。但是不想ListView有addHeaderView(),addFooterView()等。下面分享一下我自己写的RecyclerView 的Adapter。已经实现了添加头布局的功能。

1、BaseAdapter,这个Adapter只是一个基类,实现具体的adapter需要继承这个类。

public abstract class BaseAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder>{    protected static final String TAG = BaseAdapter.class.getSimpleName();    protected final Context context;    protected List<T> datas = null;    private int itemLayoutResId;//item布局    private int footerLayoutResId;    private int emptyLayoutResId;    private boolean hasData;    private boolean hasMoreData;    private boolean hasFooter;    private ArrayList<View> emptys = new ArrayList<>();    private ArrayList<View> headers = new ArrayList<>();    private final int TYPE_HEADER = 1;    private final int TYPE_FOOTER = 2;    private final int TYPE_EMPTY = 3;    private final int TYPE_ITEM = 4;    public BaseAdapter(Context context, int itemLayoutResId) {        this(context, itemLayoutResId, null);    }    public BaseAdapter(Context context, int itemLayoutResId, int emptyLayoutResId) {        this(context, itemLayoutResId, null);        this.emptyLayoutResId = emptyLayoutResId;    }    public BaseAdapter(Context context, int itemLayoutResId, int emptyLayoutResId, int footerLayoutResId) {        this(context, itemLayoutResId, null);        this.emptyLayoutResId = emptyLayoutResId;        this.footerLayoutResId = footerLayoutResId;    }    public BaseAdapter(Context context, int itemLayoutResId, List<T> datas) {        this.context = context;        this.itemLayoutResId = itemLayoutResId;        this.datas = datas == null ? new ArrayList<T>() : datas;    }    public boolean isHasData() {        return hasData;    }    public void setIsHasData(boolean isHasData) {        this.hasData = isHasData;    }    public boolean isHasFooter() {        return hasFooter;    }    public void setHasFooter(boolean hasFooter) {        if (this.hasFooter != hasFooter) {            this.hasFooter = hasFooter;            notifyDataSetChanged();        }    }    public boolean isHasMoreData() {        return hasMoreData;    }    public void setHasMoreData(boolean hasMoreData) {        if (this.hasMoreData != hasMoreData) {            this.hasMoreData = hasMoreData;            notifyDataSetChanged();        }    }    public void setHasMoreDataAndFooter(boolean hasMoreData, boolean hasFooter) {        if (this.hasMoreData != hasMoreData || this.hasFooter != hasFooter) {            this.hasMoreData = hasMoreData;            this.hasFooter = hasFooter;            notifyDataSetChanged();        }    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == TYPE_FOOTER) {            View footerView = LayoutInflater.from(context).inflate(footerLayoutResId, parent, false);            FooterViewHolder footerViewHolder = new FooterViewHolder(footerView);            return footerViewHolder;        } else if (viewType == TYPE_EMPTY) {            EmptyViewHolder emptyViewHolder = new EmptyViewHolder(emptys.get(0));            return emptyViewHolder;        } else if (viewType == TYPE_ITEM) {            View view = LayoutInflater.from(context).inflate(itemLayoutResId, parent, false);            ItemViewHolder itemViewHolder = new ItemViewHolder(view);            return itemViewHolder;        } else if (viewType == TYPE_HEADER) {            View headerView = headers.get(0);            HeaderViewHolder headerViewHolder = new HeaderViewHolder(headerView);            return headerViewHolder;        }        return null;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder viewHoder, int position) {        T item = getItem(position);        convert(viewHoder, item);    }    @Override    public int getItemViewType(int position) {        int type = TYPE_ITEM;        if (position == 0 && headers.size() > 0) {            type = TYPE_HEADER;        } else if (position == getBasicItemCount() && hasFooter) {            type = TYPE_FOOTER;        } else if (getBasicItemCount() == 0 && !hasData) {            type = TYPE_EMPTY;        } else {            type = TYPE_ITEM;        }        return type;    }    @Override    public int getItemCount() {        int size = 0;        if (getBasicItemCount() > 0) {            hasData = true;            size = getBasicItemCount() + headers.size() + (hasFooter ? 1 : 0);        } else if (getBasicItemCount() == 0) {            hasData = false;            size = emptys.size();        }        return size;    }    public int getBasicItemCount() {        return datas == null ? 0 : datas.size();    }    public T getItem(int position) {        return position >= datas.size() ? null : datas.get(position);    }    public void clear() {        emptys.clear();        for (Iterator it = datas.iterator(); it.hasNext(); ) {            T t = (T) it.next();            int position = datas.indexOf(t);            it.remove();            notifyItemRemoved(position);        }        hasFooter = false;        notifyDataSetChanged();    }    public void removeItem(T t) {        int position = datas.indexOf(t);        datas.remove(position);        notifyItemRemoved(position);    }    public void addData(List<T> datas) {        addData(0, datas);    }    public void addData(int position, List<T> list) {        if (list != null && list.size() > 0) {            for (T t : list) {                datas.add(position, t);                notifyItemInserted(position);            }        }    }    public void refreshData(List<T> list) {        clear();        if (list != null && list.size() > 0) {            int size = list.size();            for (int i = 0; i < size; i++) {                datas.add(i, list.get(i));                //notifyItemInserted(i);            }        } else {            View emptyView = View.inflate(context, emptyLayoutResId, null);            ViewGroup.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);            emptyView.setLayoutParams(layoutParams);            emptys.add(emptyView);        }        notifyDataSetChanged();    }    public void loadMoreData(List<T> list) {        if (list != null && list.size() > 0) {            int size = list.size();            int begin = datas.size();            for (int i = 0; i < size; i++) {                datas.add(list.get(i));                //notifyItemInserted(i + begin);            }            notifyDataSetChanged();        }    }    public void addHeaderView(View view) {        ViewGroup.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);        view.setLayoutParams(layoutParams);        headers.add(view);        notifyDataSetChanged();    }    protected abstract void convert(RecyclerView.ViewHolder viewHoder, T item);}

2、FooterViewHolder,我主要是用于上拉加载的时候显示加载更多

public class FooterViewHolder extends RecyclerView.ViewHolder{    private SparseArray<View> views;    public FooterViewHolder(View itemView)    {        super(itemView);        this.views = new SparseArray<View>();    }    /**     * 根据资源ID获取布局中相应的控件     */    public View getView(int viewId)    {        View view = views.get(viewId);        if (view == null)        {            view = itemView.findViewById(viewId);            views.put(viewId, view);        }        return view;    }}

3、EmptyViewHolder

public class EmptyViewHolder extends RecyclerView.ViewHolder{    private SparseArray<View> views;    public EmptyViewHolder(View itemView)    {        super(itemView);        this.views = new SparseArray<View>();    }    /**     * 根据资源ID获取布局中相应的控件     */    public View getView(int viewId)    {        View view = views.get(viewId);        if (view == null)        {            view = itemView.findViewById(viewId);            views.put(viewId, view);        }        return view;    }}

4、ItemViewHolder

public class ItemViewHolder extends RecyclerView.ViewHolder{    private SparseArray<View> views;    public ItemViewHolder(View itemView)    {        super(itemView);        this.views = new SparseArray<View>();    }    /**     * 根据资源ID获取布局中相应的控件     */    public View getView(int viewId)    {        View view = views.get(viewId);        if (view == null)        {            view = itemView.findViewById(viewId);            views.put(viewId, view);        }        return view;    }}

5、

实例讲解:下面我讲一下这个BaseAdapter怎么使用哈//使用泛型,指定Adapter的实例类public class OrderAdapter extends BaseAdapter<Order>{    public OrderAdapter(Context context)    {        //第一个是item布局,第二个是没有数据的时候空布局,第三个是下拉加载更多的时候显示的footerView        super(context, R.layout.order_item, R.layout.order_none, R.layout.footer_view);    }    //重写这个方法为ItemView绑定数据     @Override    protected void convert(RecyclerView.ViewHolder mViewHoder, final Order item)    {    }}
1 0
原创粉丝点击