RecyclerView默认没有提供类似addHeaderView()addFooterView()的API,因此这里介绍如何优雅地实现这两个接口。

如果你已经实现了一个Adapter,现在想为这个Adapter添加addHeaderView()addFooterView()接口,则需要在Adapter中添加几个Item Type,然后修改getItemViewType(),onCreateViewHolder(),onBindViewHolder(),getItemCount()等方法,并添加switch语句进行判断。那么如何在不破坏原有Adapter实现的情况下完成呢?

这里引入装饰器(Decorator)设计模式,该设计模式通过组合的方式,在不破话原有类代码的情况下,对原有类的功能进行扩展。

具体实现思路其实很简单,创建一个继承RecyclerView.Adapter<RecyclerView.ViewHolder>的类,并重写常见的方法,然后通过引入ITEM TYPE的方式实现:

public class NormalAdapterWrapper extends RecyclerView.Adapter<RecyclerView.ViewHolder>{enum ITEM_TYPE{HEADER,FOOTER,NORMAL}private NormalAdapter mAdapter;private View mHeaderView;private View mFooterView;public NormalAdapterWrapper(NormalAdapter adapter){mAdapter = adapter;}@Overridepublic int getItemViewType(int position) {if(position == 0){return ITEM_TYPE.HEADER.ordinal();} else if(position == mAdapter.getItemCount() + 1){return ITEM_TYPE.FOOTER.ordinal();} else{return ITEM_TYPE.NORMAL.ordinal();}}@Overridepublic int getItemCount() {return mAdapter.getItemCount() + 2;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if(position == 0){return;} else if(position == mAdapter.getItemCount() + 1){return;} else{mAdapter.onBindViewHolder(((NormalAdapter.VH)holder), position - 1);}}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if(viewType == ITEM_TYPE.HEADER.ordinal()){return new RecyclerView.ViewHolder(mHeaderView) {};} else if(viewType == ITEM_TYPE.FOOTER.ordinal()){return new RecyclerView.ViewHolder(mFooterView) {};} else{return mAdapter.onCreateViewHolder(parent,viewType);}}public void addHeaderView(View view){this.mHeaderView = view;}public void addFooterView(View view){this.mFooterView = view;}
}

这恰恰满足了我们的需求。我们只需要通过以下方式为原有的Adapter(这里命名为NormalAdapter)添加addHeaderView()addFooterView()接口:

NormalAdapter adapter = new NormalAdapter(data);
NormalAdapterWrapper newAdapter = new NormalAdapterWrapper(adapter);
View headerView = LayoutInflater.from(this).inflate(R.layout.item_header, mRecyclerView, false);
View footerView = LayoutInflater.from(this).inflate(R.layout.item_footer, mRecyclerView, false);
newAdapter.addFooterView(footerView);
newAdapter.addHeaderView(headerView);
mRecyclerView.setAdapter(newAdapter);

是不是看起来特别优雅。

RecycleView添加HeaderView和FooterView相关推荐

  1. Flutter开发之ListView添加HeaderView和FooterView(38)

    参考文章:Flutter ListView如何添加HeaderView和FooterView flutter的ListView添加HeaderView和FooterView使用CustomScroll ...

  2. ListView隐藏右侧滚动条,listview去掉分割线,自定义分割线,ListView添加HeaderView和FooterView

    ListView添加HeaderView和FooterView View headerView = LayoutInflater.from(AddwcrrActivity.this).inflate( ...

  3. Android 优雅的为RecyclerView添加HeaderView和FooterView

    1.概述 RecyclerView通过其高度的可定制性深受大家的青睐,也有非常多的使用者开始对它进行封装或者改造,从而满足越来越多的需求. 如果你对RecyclerView不陌生的话,你一定遇到过这样 ...

  4. 【Android】让HeaderView也参与回收机制,自我感觉是优雅的为 RecyclerView 添加 HeaderView (FooterView)的解决方案

    本文站在巨人的肩膀上 自我感觉又进了一步而成. 基于翔神的大作基础之上写的一个为RecyclerView添加HeaderView FooterView 的另一种解决方案, 翔神链接文首镇楼:http: ...

  5. Flutter开发之ListView添加HeaderView和FooterView-2(39)

    参考文章:RecyclerView添加HeaderView和FooterView 接着Flutter开发之ListView添加HeaderView和FooterView-1 继续研究. 通过Recyc ...

  6. UICollectionView的headerView、footerView使用以及与UITableView加载headerView、footerView的区别...

    为什么80%的码农都做不了架构师?>>>    前序 最近在一家公司实习,学习一些ios的知识.因为以前没有使用过UICollectionView,所以带我的导师让我仿照公司APP中 ...

  7. 如果去掉UITableView上的section的headerView和footerView的悬浮效果

    项目需要cell的间距,又不需要悬浮效果,百度之后找到这个方法,记录一下,备忘. 用UIScrollView的代理方法实现 - (void)scrollViewDidScroll:(UIScrollV ...

  8. UICollectionView添加headerview/footerView

    下面以创建footerview为例: 1.在UICollectionViewFlowLayout中添加: flowLayout.footerReferenceSize =CGSizeMake(Scre ...

  9. Android recycleview实现混合itemview,以及recycleview添加头部尾部

    需要引入的module链接:https://pan.baidu.com/s/1kcVye2vT4M0mdCtzYpUVKw 添加module方法步骤:https://blog.csdn.net/mei ...

最新文章

  1. APK 签名中应该注意的一些点 (未完待续)
  2. 验证码在服务器不显示
  3. python框架django的数据库的正向生成和反向生成
  4. 【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流
  5. CompletableFuture详解~创建实例
  6. 2016年系统集成项目管理工程师最新考试说明
  7. 算法分析之对问题建模
  8. 中国水蛭素产品行业市场供需与战略研究报告
  9. Git合并特定commits 到另一个分支
  10. GBDT 和 AdaBoost
  11. Mac屏幕常亮时间控制:Theine
  12. protel99se简明实用手册
  13. 安卓虚拟pc悬浮键盘_PC端鼠标vs手机端手势:两种交互有何异同点?
  14. 多开QQ出现多次验证码怎么办?
  15. vue中怎么把图片转换成base64字符串 , 以及base64字符串怎么转换成图片路径
  16. 康耐视Visionpro-3D Tools 总览
  17. 放开后经济会变好吗?越南是怎样度过的?
  18. 【解决方法汇总】SpringBoot项目报错 Could not resolve placeholder ‘‘ in value “${}“
  19. Android的主线程与子线程
  20. Android 不规则封闭区域填充 手指秒变油漆桶

热门文章

  1. SIP协议 会话发起协议(二)
  2. Quarter square 查找表乘法器,手动建立rom
  3. 滤镜应用——拼图效果
  4. 编写批处理文件编译.Net工程
  5. 在Eclipse新建菜单中添加菜单项,其他地方添加菜单项类似
  6. 模型需要对特征进行归一化吗_模型融合完全手册 - 套娃的艺术:将模型作为特征进行建模...
  7. php服务器错误日志在哪里看,PHP取服务器错误日志
  8. lua 获取网络时间_Lua脚本引擎教程:学习路线
  9. centos samba 看不到共享目录_samba共享服务
  10. c# mvvm模式获取当前窗口_对Vue中的MVVM原理解析和实现