RecycleView添加HeaderView和FooterView
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相关推荐
- Flutter开发之ListView添加HeaderView和FooterView(38)
参考文章:Flutter ListView如何添加HeaderView和FooterView flutter的ListView添加HeaderView和FooterView使用CustomScroll ...
- ListView隐藏右侧滚动条,listview去掉分割线,自定义分割线,ListView添加HeaderView和FooterView
ListView添加HeaderView和FooterView View headerView = LayoutInflater.from(AddwcrrActivity.this).inflate( ...
- Android 优雅的为RecyclerView添加HeaderView和FooterView
1.概述 RecyclerView通过其高度的可定制性深受大家的青睐,也有非常多的使用者开始对它进行封装或者改造,从而满足越来越多的需求. 如果你对RecyclerView不陌生的话,你一定遇到过这样 ...
- 【Android】让HeaderView也参与回收机制,自我感觉是优雅的为 RecyclerView 添加 HeaderView (FooterView)的解决方案
本文站在巨人的肩膀上 自我感觉又进了一步而成. 基于翔神的大作基础之上写的一个为RecyclerView添加HeaderView FooterView 的另一种解决方案, 翔神链接文首镇楼:http: ...
- Flutter开发之ListView添加HeaderView和FooterView-2(39)
参考文章:RecyclerView添加HeaderView和FooterView 接着Flutter开发之ListView添加HeaderView和FooterView-1 继续研究. 通过Recyc ...
- UICollectionView的headerView、footerView使用以及与UITableView加载headerView、footerView的区别...
为什么80%的码农都做不了架构师?>>> 前序 最近在一家公司实习,学习一些ios的知识.因为以前没有使用过UICollectionView,所以带我的导师让我仿照公司APP中 ...
- 如果去掉UITableView上的section的headerView和footerView的悬浮效果
项目需要cell的间距,又不需要悬浮效果,百度之后找到这个方法,记录一下,备忘. 用UIScrollView的代理方法实现 - (void)scrollViewDidScroll:(UIScrollV ...
- UICollectionView添加headerview/footerView
下面以创建footerview为例: 1.在UICollectionViewFlowLayout中添加: flowLayout.footerReferenceSize =CGSizeMake(Scre ...
- Android recycleview实现混合itemview,以及recycleview添加头部尾部
需要引入的module链接:https://pan.baidu.com/s/1kcVye2vT4M0mdCtzYpUVKw 添加module方法步骤:https://blog.csdn.net/mei ...
最新文章
- APK 签名中应该注意的一些点 (未完待续)
- 验证码在服务器不显示
- python框架django的数据库的正向生成和反向生成
- 【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流
- CompletableFuture详解~创建实例
- 2016年系统集成项目管理工程师最新考试说明
- 算法分析之对问题建模
- 中国水蛭素产品行业市场供需与战略研究报告
- Git合并特定commits 到另一个分支
- GBDT 和 AdaBoost
- Mac屏幕常亮时间控制:Theine
- protel99se简明实用手册
- 安卓虚拟pc悬浮键盘_PC端鼠标vs手机端手势:两种交互有何异同点?
- 多开QQ出现多次验证码怎么办?
- vue中怎么把图片转换成base64字符串 , 以及base64字符串怎么转换成图片路径
- 康耐视Visionpro-3D Tools 总览
- 放开后经济会变好吗?越南是怎样度过的?
- 【解决方法汇总】SpringBoot项目报错 Could not resolve placeholder ‘‘ in value “${}“
- Android的主线程与子线程
- Android 不规则封闭区域填充 手指秒变油漆桶
热门文章
- SIP协议 会话发起协议(二)
- Quarter square 查找表乘法器,手动建立rom
- 滤镜应用——拼图效果
- 编写批处理文件编译.Net工程
- 在Eclipse新建菜单中添加菜单项,其他地方添加菜单项类似
- 模型需要对特征进行归一化吗_模型融合完全手册 - 套娃的艺术:将模型作为特征进行建模...
- php服务器错误日志在哪里看,PHP取服务器错误日志
- lua 获取网络时间_Lua脚本引擎教程:学习路线
- centos samba 看不到共享目录_samba共享服务
- c# mvvm模式获取当前窗口_对Vue中的MVVM原理解析和实现