这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
这篇文章主要介绍了 Android RecyclerView 添加头部和底部实例详解的相关资料, 需要的朋友可以参考下
Android RecyclerView 添加头部和底部实例详解
如果只是想添加头部,可是使用 GitHub 里面这个项目,它可以为 LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager 布局的 RecyclerView 添加 header。使用起来也十分简单;
只需将 RecyclerViewHeader 布局放在 RecyclerView 的上层。
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <android.support.v7.widget.RecyclerView
- android:id="@+id/recycler"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|top" />
- <com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader
- android:id="@+id/header"
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:layout_gravity="center_horizontal|top">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:text="header"/>
- </com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader>
- </FrameLayout>
然后获得 RecyclerViewHeader 对象:
- RecyclerViewHeader header = (RecyclerViewHeader) findViewById(R.id.header);
把 RecyclerViewHeader 赋予 RecyclerView
- RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
- // set LayoutManager for your RecyclerView
- header.attachTo(recyclerView, true);
注意事项
RecyclerViewHeader 必须在 RecyclerView 设置了 LayoutManager 之后调用。
目前该库适用于 LinearLayoutManager,StaggeredGridLayoutManager 和 GridLayoutManager 布局的 RecyclerViews。只支持垂直布局 LayoutManager。如果你打算在 RecyclerView 中使用 setOnScrollListener(…) 方法,确保在 setOnScrollListener(…) 的 attachTo(…) 方法之前使用。
当然我们也可以自己写一个添加头部和底部的 RecyclerView。它实现的基本原理也是通过 getItemViewType 方法返回不同的类型来添加头部和底部。
首先我们自定义一个 RecyclerView:
- public class WrapRecyclerView extends RecyclerView {
- public ArrayList < View > mHeaderViews = new ArrayList < >();
- public ArrayList < View > mFooterViews = new ArrayList < >();
- //添加Adapter
- public Adapter mAdapter;
- public WrapRecyclerView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- public WrapRecyclerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public WrapRecyclerView(Context context) {
- super(context);
- }
- public void addHeaderView(View view) {
- mHeaderViews.clear();
- mHeaderViews.add(view);
- if (mAdapter != null) {
- if (! (mAdapter instanceof RecyclerWrapAdapter)) {
- mAdapter = new RecyclerWrapAdapter(mHeaderViews, mFooterViews, mAdapter);
- }
- }
- }
- public void addFooterView(View view) {
- mFooterViews.clear();
- mFooterViews.add(view);
- if (mAdapter != null) {
- if (! (mAdapter instanceof RecyclerWrapAdapter)) {
- mAdapter = new RecyclerWrapAdapter(mHeaderViews, mFooterViews, mAdapter);
- }
- }
- }
- public void setAdapter(Adapter adapter) {
- if (mHeaderViews.isEmpty() && mFooterViews.isEmpty()) {
- super.setAdapter(adapter);
- } else {
- adapter = new RecyclerWrapAdapter(mHeaderViews, mFooterViews, adapter);
- super.setAdapter(adapter);
- }
- mAdapter = adapter;
- }
- }
我们会看到我们有一个 RecyclerWrapAdapter 没有实现,下面我们就来看下 RecyclerWrapAdapter,这个也是实现添加头部和尾部的关键。
- public class RecyclerWrapAdapter extends RecyclerView.Adapter implements WrapperAdapter {
- private RecyclerView.Adapter mAdapter;
- private ArrayList < View > mHeaderViews;
- private ArrayList < View > mFootViews;
- static final ArrayList < View > EMPTY_INFO_LIST = new ArrayList < View > ();
- private int mCurrentPosition;
- public RecyclerWrapAdapter(ArrayList < View > mHeaderViews, ArrayList < View > mFootViews, RecyclerView.Adapter mAdapter) {
- this.mAdapter = mAdapter;
- if (mHeaderViews == null) {
- this.mHeaderViews = EMPTY_INFO_LIST;
- } else {
- this.mHeaderViews = mHeaderViews;
- }
- if (mFootViews == null) {
- this.mFootViews = EMPTY_INFO_LIST;
- } else {
- this.mFootViews = mFootViews;
- }
- }
- public int getHeadersCount() {
- return mHeaderViews.size();
- }
- public int getFootersCount() {
- return mFootViews.size();
- }@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- if (viewType == RecyclerView.INVALID_TYPE) {
- return new HeaderViewHolder(mHeaderViews.get(0));
- } else if (viewType == RecyclerView.INVALID_TYPE - 1) {
- return new HeaderViewHolder(mFootViews.get(0));
- }
- return mAdapter.onCreateViewHolder(parent, viewType);
- }
- @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- //如果头部不为空,那么我们就要先添加头部,所以我们只要
- //把前面几个position给头部,当position小于头部总数的时候,
- //我们返回头部view。再判断原Adapter 的 count 与当前 position
- // 的差值来比较,是调用原 Adapter 的 getView 方法,还是获取 footView
- // 的 view。
- int numHeaders = getHeadersCount();
- if (position < numHeaders) {
- return;
- }
- int adjPosition = position - numHeaders;
- int adapterCount = 0;
- if (mAdapter != null) {
- adapterCount = mAdapter.getItemCount();
- if (adjPosition < adapterCount) {
- mAdapter.onBindViewHolder(holder, adjPosition);
- return;
- }
- }
- }
- @Override public int getItemCount() {
- if (mAdapter != null) {
- return getHeadersCount() + getFootersCount() + mAdapter.getItemCount();
- } else {
- return getHeadersCount() + getFootersCount();
- }
- }
- @Override public RecyclerView.Adapter getWrappedAdapter() {
- return mAdapter;
- }@Override public int getItemViewType(int position) {
- //增加两个类型
- //RecyclerView.INVALID_TYPE 添加头部
- //RecyclerView.INVALID_TYPE-1 添加尾部
- //如果头部不为空,那么我们就要先添加头部,所以我们只要
- //把前面几个position给头部,当position小于头部总数的时候,
- //我们返回头部类型。再判断原Adapter 的 count 与当前 position
- // 的差值来比较,是调用原 Adapter 的 类型,还是获取 footView
- // 的类型。
- mCurrentPosition = position;
- int numHeaders = getHeadersCount();
- if (position < numHeaders) {
- return RecyclerView.INVALID_TYPE;
- }
- int adjPosition = position - numHeaders;
- int adapterCount = 0;
- if (mAdapter != null) {
- adapterCount = mAdapter.getItemCount();
- if (adjPosition < adapterCount) {
- return mAdapter.getItemViewType(adjPosition);
- }
- }
- return RecyclerView.INVALID_TYPE - 1;
- }
- private static class HeaderViewHolder extends RecyclerView.ViewHolder {
- public HeaderViewHolder(View itemView) {
- super(itemView);
- }
- }
- }
我们还可以实现一个接口,来调用 RecyclerWrapAdapter 对象:
- public interface WrapperAdapter {
- public RecyclerView.Adapter getWrappedAdapter();
- }
这样我们就可以把 RecyclerView 布局改成 WrapRecyclerView 就可以了,然后调用 addHeaderView 或者 addFooterView 就可以添加头部和尾部了。
来源: http://www.phperz.com/article/17/0817/337586.html