全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # RecyclerView  # RecyclerView添加头部和底部  # Android中封装RecyclerView实现添加头部和底部示例代码  # Recyclerview添加头布局和尾布局、item点击事件详解  # Android实现RecyclerView添加分割线的简便方法  # Android RecyclerView添加头部和底部的方法  # 使用RecyclerView添加Header和Footer的方法  # Android实战RecyclerView头部尾部添加方法示例  # 几个  # 就可以  # 要先  # 为空  # 如果你  # 放在  # 还可以  # 只需  # 适用于  # 希望能  # 自定义  # 它可以  # 谢谢大家  # 来也  # 基本原理  # 有一个  # layout_centerInParent  # TextView  # true  # findViewById 


相关文章: 网站网页制作专业公司,怎样制作自己的网页?  建站之星备案流程有哪些注意事项?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站OpenVZ教程与优化策略:配置指南与性能提升  如何通过IIS搭建网站并配置访问权限?  制作表格网站有哪些,线上表格怎么弄?  建站之星如何助力网站排名飙升?揭秘高效技巧  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何在IIS7上新建站点并设置安全权限?  建站org新手必看:2024最新搭建流程与模板选择技巧  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  测试制作网站有哪些,测试性取向的权威测试或者网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站之星收费标准详解:套餐费用及年费价格表一览  如何将凡科建站内容保存为本地文件?  如何通过虚拟机搭建网站?详细步骤解析  建站主机是否等同于虚拟主机?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  北京专业网站制作设计师招聘,北京白云观官方网站?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何挑选最适合建站的高性能VPS主机?  建站之星如何快速解决建站难题?  北京制作网站的公司,北京铁路集团官方网站?  高防服务器租用如何选择配置与防御等级?  平台云上自主建站:模板化设计与智能工具打造高效网站  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  建站之星展会模板:智能建站与自助搭建高效解决方案  用v-html解决Vue.js渲染中html标签不被解析的问题  如何通过商城免费建站系统源码自定义网站主题?  定制建站价位费用解析与套餐推荐全攻略  如何零成本快速生成个人自助网站?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何通过虚拟主机空间快速建站?  常州企业建站如何选择最佳模板?  行程制作网站有哪些,第三方机票电子行程单怎么开?  青岛网站建设如何选择本地服务器?  外贸公司网站制作哪家好,maersk船公司官网?  如何快速配置高效服务器建站软件?  MySQL查询结果复制到新表的方法(更新、插入)  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  简历在线制作网站免费版,如何创建个人简历?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  Python lxml的etree和ElementTree有什么区别  建站上传速度慢?如何优化加速网站加载效率?  宝塔面板如何快速创建新站点?  建站之星导航如何优化提升用户体验?  如何快速生成凡客建站的专业级图册? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。