RecyclerView的增强--------添加(多个)头布局和尾布局

一 简介

RecyclerView的使用很好似方便,但是没有添加头和尾的功能,只能仿照listview来做了.

参考网上其他大神的代码,组织了一个自己的.以方便之后使用.

使用思想是增强原有的功能,需要传入一个已经存在的adapter

二 代码

public class HeaderAndFooterAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private RecyclerView.Adapter<RecyclerView.ViewHolder> mAdapter;
    public static final int IS_HEADER = 30000;
    public static final int IS_FOOTER = 20000;
    public static final int IS_NORMAL = 10000;
    private SparseArrayCompat<View> headerList;
    private SparseArrayCompat<View> footerList;

    public HeaderAndFooterAdapter(RecyclerView.Adapter<RecyclerView.ViewHolder> adapter) {
        mAdapter = adapter;
        headerList = new SparseArrayCompat<>();
        footerList = new SparseArrayCompat<>();

    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (headerList.get(viewType) != null) {
            return new HeaderHolder(headerList.get(viewType));
        }
        if (footerList.get(viewType) != null) {
            return new FooterHolder(footerList.get(viewType));
        }

        return mAdapter.onCreateViewHolder(parent, viewType);

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        if (isHeaderPosition(position)) {
            return;
        }
        if (isFooterPosition(position)) {
            return;
        }
        mAdapter.onBindViewHolder(holder, position - headerList.size());

    }

    @Override
    public int getItemCount() {
        return headerList.size() + footerList.size() + mAdapter.getItemCount();
    }


    @Override
    public int getItemViewType(int position) {
        if (isHeaderPosition(position)) {
            return headerList.keyAt(position);
        }
        if (isFooterPosition(position)) {
            return footerList.keyAt(position - headerList.size() - mAdapter.getItemCount());
        }
        return IS_NORMAL;
    }

    private boolean isFooterPosition(int position) {
        return footerList.size() > 0 && position >= (mAdapter.getItemCount() + headerList.size());
    }

    private boolean isHeaderPosition(int position) {
        return headerList.size() > 0 && position < headerList.size();
    }

    public void addHeaderView(View view) {
        headerList.put(headerList.size() + IS_HEADER, view);
    }

    public void addFooterView(View view) {
        footerList.put(footerList.size() + IS_FOOTER, view);
    }

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

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

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
            ((GridLayoutManager) layoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    return getItemViewType(position) ==
                            IS_NORMAL ? 1 : ((GridLayoutManager) layoutManager).getSpanCount();

                }
            });
        }
    }

    @Override
    public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
        super.onViewAttachedToWindow(holder);
        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
        if (lp != null
                && lp instanceof StaggeredGridLayoutManager.LayoutParams
                && getItemViewType(holder.getLayoutPosition()) != IS_NORMAL) {
            ((StaggeredGridLayoutManager.LayoutParams) lp).setFullSpan(true);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值