封装通用RecyclerView.Adapter

一. BaseViewHolder

public class BaseViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViewArray;

    public BaseViewHolder(View view) {
        super(view);
        mViewArray = new SparseArray<>();
    }

    public BaseViewHolder(ViewGroup parent,int layotID){
        this(LayoutInflater.from(parent.getContext()).inflate(layotID,parent,false));

    }

    protected <T extends View> T getView(int viewID){
        View view = mViewArray.get(viewID);
        if (view == null) {
            view = itemView.findViewById(viewID);
            mViewArray.put(viewID, view);
        }
        return (T) view;
    }

    protected Context getContext(){
        return itemView.getContext();
    }

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

二.AsbAdapter

public abstract class AbsAdapter<VH extends BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder> {

    public static final int VIEW_TYPE_HEADER = 1024;
    public static final int VIEW_TYPE_FOOTER = 1025;

    protected View mHeaderView;
    protected View mFooterView;

    protected Context mContext;

    public AbsAdapter(Context context) {
        this.mContext = context;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_HEADER) {
            return new BaseViewHolder(mHeaderView);
        } else if (viewType == VIEW_TYPE_FOOTER) {
            return new BaseViewHolder(mFooterView);
        }else {
            return createCustomViewHolder(parent,viewType);
        }
    }

    /***
     * 创建自定义的ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    public abstract VH createCustomViewHolder(ViewGroup parent, int viewType);

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_HEADER:
            case VIEW_TYPE_FOOTER:
                break;
            default:
                bindCoustomViewHolder((VH) holder,position);
                break;
        }
    }

    /***
     * 绑定自定义的ViewHolder
     * @param holder
     * @param position
     */
    public abstract void bindCoustomViewHolder(VH holder,int position);

    public void addHeaderView(View headerView){
        if (null == headerView)return;

        this.mHeaderView = headerView;
        notifyDataSetChanged();
    }

    public void removeHeaderView(){
        if (mHeaderView !=null){
            mHeaderView = null;
            notifyDataSetChanged();
        }
    }

    public void addFooterView(View footerView){
        if (null == footerView)return;

        this.mFooterView = footerView;
        notifyDataSetChanged();

    }

    public void removeFooterView(){
        if (mFooterView !=null){
            mFooterView =null;
            notifyDataSetChanged();
        }

    }


    /***
     *  获取附加View的数量,包括HeaderView和FooterView
     * @return
     */
    public int getExtraViewCount(){
        int extraViewCount =0;
        if (mHeaderView !=null){
            extraViewCount ++;
        }

        if (mFooterView !=null){
            extraViewCount ++;
        }

        return extraViewCount;
    }

    public int getHeaderExtraViewCount(){
        return mHeaderView ==null?0:1;
    }

    public int getFooterExtraViewCount(){
        return mFooterView ==null?0:1;
    }

}

三.BaseAdapter

public abstract class BaseAdapter<M,VH extends BaseViewHolder> extends AbsAdapter {

    private List<M> mDataList;

    public BaseAdapter(Context context) {
        this(context,null);
    }

    public BaseAdapter(Context context,List<M>list) {
        super(context);
        if (list !=null){
            this.mDataList = list;
        }else {
            mDataList = new ArrayList<>();
        }
    }

    /***
     * 填充数据,此操作会清除原来的数据
     * @param list
     */
    public void fillList(List<M> list){
        mDataList.clear();
        boolean result = mDataList.addAll(list);
        if (result) notifyDataSetChanged();

    }

    /***
     * 追加一条数据
     * @param data
     */
    public void appendItem(M data){
        mDataList.add(data);
        int size = mDataList.size();
        if (getHeaderExtraViewCount() ==0){
            notifyItemInserted(size -1);
        }else {
            notifyItemInserted(size);
        }
    }

    public  boolean isContains(M data){
        return  mDataList.contains(data);
    }

    /***
     * 追加集合数据
     * @param list
     */
    public void appendList(List<M> list){
        mDataList.addAll(list);
        notifyDataSetChanged();
    }

    /**
     * 置顶某条数据
     * @param data
     */
    public void proposeItem(M data){
        mDataList.add(0,data);
        notifyItemInserted(getHeaderExtraViewCount() ==0?0:getHeaderExtraViewCount());
    }

    /***
     * 置顶集合数据
     * @param list
     */
    public void proposeLlist(List<M> list){
        mDataList.addAll(0,list);
        notifyDataSetChanged();
    }


    public void removeItem(int position){
        mDataList.remove(getHeaderExtraViewCount() ==0?position:position-1);
        notifyItemRemoved(position);
    }

    public void removeItem(M data){
        int index = mDataList.indexOf(data);
        if (index<0){
            return;
        }

        mDataList.remove(index);
        notifyItemRemoved(getHeaderExtraViewCount() ==0?index:index +1);

    }

    public void updateItem(M data){
        int index = mDataList.indexOf(data);
        if (index <0){
            return;
        }

        mDataList.set(index,data);
        notifyItemChanged(mHeaderView ==null?index:index+1);

    }

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

    public M getItem(int position){
        if ((mHeaderView !=null && position ==0)||(position>=mDataList.size() +getHeaderExtraViewCount())){
            return  null;
        }

        return mHeaderView == null ? mDataList.get(position) : mDataList.get(position - 1);
    }

    public M getItem(VH holder){
        return  getItem(holder.getAdapterPosition());
    }


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

    @Override
    public int getItemViewType(int position) {
        if (mHeaderView !=null && position ==0){
            return VIEW_TYPE_HEADER;
        }else if (mFooterView !=null&& position==mDataList.size() +getHeaderExtraViewCount()){
            return VIEW_TYPE_FOOTER;
        }else {
            return  getCustomViewType(position);
        }
    }

    protected abstract int getCustomViewType(int position);

    @Override
    public int getItemCount() {
        return getExtraViewCount() +mDataList.size();
    }



}

转载于:https://my.oschina.net/chenyongchang/blog/886500

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值