简单实现RecyclerView 头部尾部

先看效果:

简单实现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) {
                //调用原来的adapteronBindViewHolder
                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部分。