Android-RecyclerView-非常好用的上垃刷新

说明

分两个Adapter
一个用于专门显示的Adapter,
另一个用于刷新的Adapter。

用于显示的Adapter

集成QuickAdapter,是自己封装的一个Adpater,正常的显示数据,跟平时的逻辑一样

刷新的Adapter

HeaderAndFooterRecyclerViewAdapter
这个将显示的Adapter包裹在其中,刷新的Adapter用于逻辑的处理,也就是嵌套调用。

QuickAdapter源代码

public abstract class QuickAdapter<T> extends RecyclerView.Adapter<VH> {

    private List<T> mDatas;
    //    protected OnItemClickListener<T> mItemClickListener;
    protected OnNoDoubleClickListener mOnClickListener;

    public QuickAdapter() {
        mDatas = new ArrayList<>();
    }

    public QuickAdapter(List<T> mDatas) {
        this.mDatas = mDatas;
    }


    public void setDatas(List<T> mDatas) {
        this.mDatas = mDatas;
    }

    public void addDatas(List<T> newDatas) {
        if (mDatas == null) {
            mDatas = new ArrayList<T>();
        }
        mDatas.addAll(newDatas);
    }

    public List<T> getDatas() {
        if (this.mDatas == null) {
            this.mDatas = new ArrayList<>();
        }
        return this.mDatas;
    }

    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = IStarViewUtils.inflate(getItemLayoutId(viewType), parent);
        final VH holder = new VH(itemView);

        return holder;
    }

//    public void setItemClickListener(OnItemClickListener<T> itemClickListener) {
//        mItemClickListener = itemClickListener;
//    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        onBindViewHolder(holder, mDatas.get(position), position);
    }

    public abstract void onBindViewHolder(VH holder, T data, int position);

    public abstract int getItemLayoutId(int viewType);

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


    public <T> void setOnClickListener(OnNoDoubleClickListener<T> onClickListener) {
        this.mOnClickListener = onClickListener;
    }

    public void addOnClickListener(View mView, int resId, final T t) {
        IStarViewUtils.setOnClickListener(mView, resId, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnClickListener != null) {
                    try {
                        mOnClickListener.onClick(v, t);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public void addOnClickListener(View mView, final T t) {
        IStarViewUtils.setOnClickListener(mView, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnClickListener != null) {
                    try {
                        mOnClickListener.onClick(v, t);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }


}

HeaderAndFooterRecyclerViewAdapter源代码

/**
 * Created by cundong on 2015/10/9.11
 * <p/>
 * RecyclerView.Adapter with Header and Footer
 */
public class HeaderAndFooterRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public static final int TYPE_HEADER_VIEW = -2147483648;
    public static final int TYPE_NORMAL_VIEW = -2147483648 + 2;
    public static final int TYPE_FOOTER_VIEW = -2147483648 + 1;


    /**
     * RecyclerView使用的,真正的Adapter
     */
    private RecyclerView.Adapter<RecyclerView.ViewHolder> mInnerAdapter;

    private ArrayList<View> mHeaderViews = new ArrayList<>();
    private ArrayList<View> mFooterViews = new ArrayList<>();

    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;

    private RecyclerView.AdapterDataObserver mDataObserver = new RecyclerView.AdapterDataObserver() {

        @Override
        public void onChanged() {
            super.onChanged();
            notifyDataSetChanged();
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            super.onItemRangeChanged(positionStart, itemCount);
            notifyItemRangeChanged(positionStart + getHeaderViewsCount(), itemCount);
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            notifyItemRangeInserted(positionStart + getHeaderViewsCount(), itemCount);
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            super.onItemRangeRemoved(positionStart, itemCount);
            notifyItemRangeRemoved(positionStart + getHeaderViewsCount(), itemCount);
        }

        @Override
        public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
            super.onItemRangeMoved(fromPosition, toPosition, itemCount);
            int headerViewsCountCount = getHeaderViewsCount();
            notifyItemRangeChanged(fromPosition + headerViewsCountCount, toPosition + headerViewsCountCount + itemCount);
        }
    };

    public HeaderAndFooterRecyclerViewAdapter() {
    }

    public HeaderAndFooterRecyclerViewAdapter(RecyclerView.Adapter innerAdapter) {
        setAdapter(innerAdapter);
    }

    public HeaderAndFooterRecyclerViewAdapter(RecyclerView.Adapter innerAdapter, boolean sticky) {
        setAdapter(innerAdapter);
    }

    /**
     * 设置adapter
     *
     * @param adapter
     */
    public void setAdapter(RecyclerView.Adapter<RecyclerView.ViewHolder> adapter) {

        if (adapter != null) {
            if (!(adapter instanceof RecyclerView.Adapter))
                throw new RuntimeException("your adapter must be a RecyclerView.Adapter");
        }

        if (mInnerAdapter != null) {
            notifyItemRangeRemoved(getHeaderViewsCount(), mInnerAdapter.getItemCount());
            mInnerAdapter.unregisterAdapterDataObserver(mDataObserver);
        }

        this.mInnerAdapter = adapter;
        mInnerAdapter.registerAdapterDataObserver(mDataObserver);
        notifyItemRangeInserted(getHeaderViewsCount(), mInnerAdapter.getItemCount());
    }

    public RecyclerView.Adapter getInnerAdapter() {
        return mInnerAdapter;
    }

    public void addHeaderView(View header) {

        if (header == null) {
            throw new RuntimeException("header is null");
        }

        mHeaderViews.add(header);
        this.notifyDataSetChanged();
    }

    public void addFooterView(View footer) {

        if (footer == null) {
            throw new RuntimeException("footer is null");
        }

        mFooterViews.add(footer);
        this.notifyDataSetChanged();
    }

    /**
     * 返回第一个FoView
     *
     * @return
     */
    public View getFooterView() {
        return getFooterViewsCount() > 0 ? mFooterViews.get(0) : null;
    }

    /**
     * 返回第一个HeaderView
     *
     * @return
     */
    public View getHeaderView() {
        return getHeaderViewsCount() > 0 ? mHeaderViews.get(0) : null;
    }

    public void removeHeaderView(View view) {
        mHeaderViews.remove(view);
        this.notifyDataSetChanged();
    }

    public void removeFooterView(View view) {
        mFooterViews.remove(view);
        this.notifyDataSetChanged();
    }

    public int getHeaderViewsCount() {
        return mHeaderViews.size();
    }

    public int getFooterViewsCount() {
        return mFooterViews.size();
    }

    public boolean isHeader(int position) {
        return getHeaderViewsCount() > 0 && position == 0;
    }

    public boolean isFooter(int position) {
        int lastPosition = getItemCount() - 1;
        return getFooterViewsCount() > 0 && position == lastPosition;
    }

    // 获取HeaderView的类型
    public static int getHeaderViewType(int position) {
        return TYPE_HEADER_VIEW + position;
    }

    // 后去FooterView的类型
    public int getFooterViewType(int position) {
        return TYPE_FOOTER_VIEW + position - mInnerAdapter.getItemCount();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        int headerViewsCount = getHeaderViewsCount();
        if (viewType < TYPE_HEADER_VIEW + headerViewsCount) {
            return new ViewHolder(mHeaderViews.get(viewType - TYPE_HEADER_VIEW));
        } else if (viewType >= headerViewsCount + TYPE_FOOTER_VIEW && viewType < TYPE_FOOTER_VIEW + getItemCount()) {
            return new ViewHolder(mFooterViews.get(viewType - TYPE_FOOTER_VIEW - headerViewsCount));
        } else {
            return mInnerAdapter.onCreateViewHolder(parent, viewType);
        }
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int headerViewsCountCount = getHeaderViewsCount();
        if (position >= headerViewsCountCount && position < headerViewsCountCount + mInnerAdapter.getItemCount()) {
            mInnerAdapter.onBindViewHolder(holder, position - headerViewsCountCount);
        } else {
            ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();

            if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
                ((StaggeredGridLayoutManager.LayoutParams) layoutParams).setFullSpan(true);
            } else if (layoutParams == null && mLayoutManager instanceof StaggeredGridLayoutManager) {
                StaggeredGridLayoutManager.LayoutParams lp = new StaggeredGridLayoutManager.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);

                lp.setFullSpan(true);
                holder.itemView.setLayoutParams(lp);
            }
        }
    }

    @Override
    public int getItemCount() {
        return getHeaderViewsCount() + getFooterViewsCount() + mInnerAdapter.getItemCount();
    }

    public boolean isHeaderMoreThanFooter() {
        int headerViewsCount = getHeaderViewsCount();
        int footerViewsCount = getFooterViewsCount();
        return headerViewsCount > footerViewsCount;
    }

    // 最大的那个计数, 避免冲突
    public int getRangeCount() {
        int headerViewsCount = getHeaderViewsCount();
        int footerViewsCount = getFooterViewsCount();
        if (headerViewsCount > footerViewsCount) {
            return headerViewsCount;
        } else {
            return footerViewsCount;
        }
    }

    @Override
    public int getItemViewType(int position) {
        int headerViewsCount = getHeaderViewsCount();
        if (position < headerViewsCount) {
            return getHeaderViewType(position);
        } else if (position < headerViewsCount + mInnerAdapter.getItemCount()) {
            return mInnerAdapter.getItemViewType(position - getHeaderViewsCount());
        } else {
            return getFooterViewType(position);
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View itemView) {
            super(itemView);
        }
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        mInnerAdapter.onAttachedToRecyclerView(recyclerView);

        if (mLayoutManager == null) {
            mLayoutManager = recyclerView.getLayoutManager();
        }
    }

    @Override
    public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
        super.onViewAttachedToWindow(holder);

        if (mLayoutManager == null && mRecyclerView != null) {
            mLayoutManager = mRecyclerView.getLayoutManager();
        }
    }
}
发布了167 篇原创文章 · 获赞 62 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/AdrianAndroid/article/details/100150766