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就可以添加头部和尾部了。

以上就是本文的全部内容,希望对大家学习Android 软件编程有所帮助。

(0)

相关推荐

  • Recyclerview添加头布局和尾布局、item点击事件详解

    简介: 本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件 思路: 主要重写Recyclerview.Adapter中的一些方法 1.public int getItemCount()  item熟练  +2(头布局和尾布局) 2.public int getItemViewType(int position)   判断position 设置itemType 3.创建不同的ViewHolder,分别用来加载头布局,正常布局,尾布局 4.public

  • Android 中RecyclerView多种item布局的写法(头布局+脚布局)

    RecyclerView多个item布局的写法(头布局+脚布局) 上图 github 下载源码 Initial commit第一次提交的代码,为本文内容 以下的为主要代码,看注释即可,比较简单 MainActivity 含上拉加载更多 package com.anew.recyclerviewall; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivi

  • Android中封装RecyclerView实现添加头部和底部示例代码

    前言 我们大家都知道ListView具有添加头部和添加底部的方法,但是RecyclerView并没有这样子的方法.所以RecyclerView是不能添加底部和头部的,但是能不能仿造ListView来实现RecyclerView添加头部和底部呢?答案当然是可行的.本文就来给大家介绍了关于Android封装RecyclerView添加头部和底部的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 首先看下实现的效果: 代码如下: public class WrapMyRecy

  • Android RecyclerView添加头部和底部实例详解

    Android RecyclerView添加头部和底部实例详解 如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_p

  • Android RecyclerView添加头部和底部的方法

    如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_parent" android:layout_heigh

  • 使用RecyclerView添加Header和Footer的方法

    RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集.RecyclerView用以下两种方式简化了数据的展示和处理: 使用LayoutManager来确定每一个item的排列方式. 为增加和删除项目提供默认的动画效果. RecyclerView虽然作为ListView的替代者有着较好的性能提升,但是ListView的一些常用功能却没有提供,比如我们平时会经常用到的addHeaderView,addFooterView,既然RecyclerVi

  • android RecyclerView添加footerview详解

    class FooterViewAdapter :RecyclerView.Adapter<RecyclerView.ViewHolder>() { companion object { const val TYPE_FOOTER: Int = 1 const val TYPE_NORMAL: Int = 0 } var isFooterView: Boolean = false fun setFooterView() { this.isFooterView = true notifyItem

  • Android RecyclerView添加上拉加载更多效果

    先看一下效果 刷新的时候是这样的: 没有更多的时候是这样的: 既然有刷新的时候有两种状态就要定义两个状态 //普通布局的type static final int TYPE_ITEM = 0; //脚布局 static final int TYPE_FOOTER = 1; 在特定的时候去显示: @Override public int getItemViewType(int position) { //如果position加1正好等于所有item的总和,说明是最后一个item,将它设置为脚布局

  • Android RecyclerView添加FootView和HeadView

    前提概要: 上一篇文章已经介绍过了RecyclerView的基本使用方法,原文如下:android RecyclerView布局真的只是那么简单!此篇文章算是对RecyclerView更深使用的介绍. FootView和HeadView在ListView中的本身就有相对应的函数,但是在新潮的RecyclerView中却没有了,FootView在分页加载(上拉加载更多)中起着很重要的作用,因此也必须要学习一下了.(HeadView的添加与FootView的添加相比大致一样,在此就只讲FootVie

  • Android GridView添加头部问题的解决

    我们都知道ListView有addHeaderView和addFooterView两个方法.其中addHeaderView是添加头部布局,addFooterView是添加底部布局.但是GridView却没有这两个方法这个时候就需要重写GridView了.geogle官方给出了重写的HeaderGridView不知道为什么没有添加到官方api里面.代码如下: public class HeaderGridView extends GridView { private static final St

  • Android RecyclerView实现多种item布局的方法

    在项目中列表是基本都会用到的,然而在显示列表时,我们需要的数据可能需要不止一种item显示,对于复杂的数据就需要多种item,以不同的样式显示出来,这样效果是很棒的,我们先看一下效果 我们可以看到,这个RecyclerView中有多种item显示出来,那么具体怎么实现呢,其实在RecyclerView中,我们可以重写方法getItemViewType(),这个方法会传进一个参数position表示当前是第几个Item,然后我们可以通过position拿到当前的Item对象,然后判断这个item对

  • Android RecyclerView添加上拉加载更多功能

    上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了. 上一篇文章地址:为RecyclerView添加FootView和HeadView 效果:(源码在文章结尾) 实现关键 在上一篇代码的基础上,只需要在onBindViewHolder(ViewHolder holder, int position)函数中添加一定修改就可以了,如下: @Override public void onBindViewHolder(ViewHold

随机推荐