一 简介
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); } } }