简单实现RecyclerView 头部尾部
先看效果:
效果大概就这个样子了,没做什么效果,有点丑。
实现方法:参照listview源码实现,静态代理。重写RecyclerView 的setAdapter,如果有头部或者尾部就将RecyclerView本来的adapter再封装一层,由其adapterde包装类去处理头部尾部和本身的body部分;
RecyclerView重写源码如下:
public class WrapperRecylerView extends RecyclerView { /**头部的view*/ private List<View> mHeaderViews = new ArrayList<>(); /**尾部的view*/ private List<View> mFooterViews = new ArrayList<>(); private Adapter mAdapter; public WrapperRecylerView(Context context) { super(context); } public WrapperRecylerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public WrapperRecylerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void addHeaderView(View view) { mHeaderViews.add(view); } public void addFootView(View view) { mFooterViews.add(view); } @Override public void setAdapter(Adapter adapter) { if (mHeaderViews.size() > 0 || mFooterViews.size() > 0) { //如果有头部或者尾部,则将原来的adapter在包装一层 mAdapter = new HeaderRecylerListAdapter(mHeaderViews, mFooterViews, adapter); } else { mAdapter = adapter; } super.setAdapter(mAdapter); } }
HeaderRecylerListAdapter:
public class HeaderRecylerListAdapter extends RecyclerView.Adapter { /**头部的view*/ private List<View> mHeaderViews; /**尾部的view*/ private List<View> mFooterViews; private RecyclerView.Adapter mAdapter; private final int VIEW_TYPE_HEADER = 0X10; private final int VIEW_TYPE_BODY = 0X11; private final int VIEW_TYPE_FOOTER = 0X12; public HeaderRecylerListAdapter(List<View> mHeaderViews, List<View> mFooterViews, RecyclerView.Adapter mAdapter) { this.mHeaderViews = mHeaderViews; this.mFooterViews = mFooterViews; this.mAdapter = mAdapter; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case VIEW_TYPE_HEADER: //TODO:实现多个头部添加 return new HeaderViewHolder(mHeaderViews.get(0)); case VIEW_TYPE_FOOTER: //TODO:实现多个尾部添加 return new HeaderViewHolder(mFooterViews.get(0)); } return mAdapter.createViewHolder(parent, viewType); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // Header (negative positions will throw an IndexOutOfBoundsException) int numHeaders = getHeaderConut(); if (position < numHeaders) { return; } // Adapter 原来的adapter body在这里显示 final int adjPosition = position - numHeaders; int adapterCount = 0; if (mAdapter != null) { adapterCount = mAdapter.getItemCount(); if (adjPosition < adapterCount) { //调用原来的adapter的onBindViewHolder mAdapter.onBindViewHolder(holder, adjPosition); } } // Footer (off-limits positions will throw an IndexOutOfBoundsException) //由于返回值为void,所以footer无需处理 } @Override public int getItemViewType(int position) { int numHeaders = getHeaderConut(); if (position < numHeaders) { //头部 return VIEW_TYPE_HEADER; } //正常条目部分 // Adapter body final int adjPosition = position - numHeaders; int adapterCount = 0; if (mAdapter != null) { adapterCount = mAdapter.getItemCount(); if (adjPosition < adapterCount) { //调用原来的adapter 的getItemViewType return mAdapter.getItemViewType(adjPosition); } } //尾部 return VIEW_TYPE_FOOTER; } @Override public int getItemCount() { if (mAdapter != null) { return mAdapter.getItemCount() + getHeaderConut() + getFooterConut(); } else { return getHeaderConut() + getFooterConut(); } } private int getHeaderConut() { return mHeaderViews == null ? 0 : mHeaderViews.size(); } private int getFooterConut() { return mFooterViews == null ? 0 : mFooterViews.size(); } public class HeaderViewHolder extends RecyclerView.ViewHolder { public HeaderViewHolder(View itemView) { super(itemView); } } }目前HeaderRecylerListAdapter不支持多个Header或者Footer的添加,实现需要主要分为三部分去写:头部、尾部以及本身自带adapter部分。