RecyclerView实现按时间分组手机相册效果
RecyclerView通常只有一个header和footer,但是像手机相册这种布局每个item都会有一个header该怎么办,其中一种办法就是RecyclerView嵌套RecyclerView,虽然能实现但是并不怎么友好,如何只创建一个RecyclerView就实现这种布局呢?
在github上找到了SectionedRecyclerView,不需要改动RecyclerView,定义adapter的时候只需要继承SectionedRecyclerViewAdapter即可,首先来看效果图
但是SectionedRecyclerViewAdapter使用的时候比平时的adapter多一些方法,下面简单介绍一下:
- SectionedRecyclerView这个库提供了两种adapter,一个是SectionedRecyclerViewAdapter,功能比较完成,有footer,另一个是SimpleSectionedAdapter,顾名思义就是简化版,只是有header,不需要footer
- 继承SectionedRecyclerViewAdapter时,通过hasFooterInSection设置是否显示footer布局
下面贴出继承两种adapter的代码,方法的注释都写在上面了,只是比普通的adapter多了header和footer布局
继承SectionedRecyclerViewAdapter:
/*** @Description: 完整的adapter* 注意:通过hasFooterInSection()这个方法来设置是否需要显示footer* @author: ZhangYW* @time: 2019/1/24 9:39*/
public class MyAdapter extends SectionedRecyclerViewAdapter<MyAdapter.MyHeaderViewHolder, MyAdapter.MyItemViewHolder, MyAdapter.MyFooterViewHolder> {private Context mContext;private List<MyBean> mList;public MyAdapter(Context context, List<MyBean> list) {this.mContext = context;this.mList = list;}/*** header或者footer的个数* @return*/@Overrideprotected int getSectionCount() {return mList.size();}/*** 每个header或者footer中包含具体的内容个数* @return*/@Overrideprotected int getItemCountForSection(int section) {return mList.get(section).getList().size();}/*** 是否显示footer* @param section* @return*/@Overrideprotected boolean hasFooterInSection(int section) {return true;}/*** 渲染具体的HeaderViewHolder** @param parent HeaderViewHolder的容器* @param viewType 一个标志,我们根据该标志可以实现渲染不同类型的ViewHolder* @return*/@Overrideprotected MyHeaderViewHolder onCreateSectionHeaderViewHolder(ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_rv_header, parent, false);return new MyHeaderViewHolder(itemView);}/*** 渲染具体的FooterViewHolder** @param parent FooterViewHolder的容器* @param viewType 一个标志,我们根据该标志可以实现渲染不同类型的ViewHolder* @return*/@Overrideprotected MyFooterViewHolder onCreateSectionFooterViewHolder(ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_rv_footer, parent, false);return new MyFooterViewHolder(itemView);}/*** 渲染具体的ItemViewHolder** @param parent ItemViewHolder的容器* @param viewType 一个标志,我们根据该标志可以实现渲染不同类型的ViewHolder* @return*/@Overrideprotected MyItemViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_rv_content, parent, false);return new MyItemViewHolder(itemView);}/*** 绑定HeaderViewHolder的数据。** @param holder* @param section 数据源list的下标*/@Overrideprotected void onBindSectionHeaderViewHolder(MyHeaderViewHolder holder, int section) {MyBean bean = mList.get(section);if (null == bean)return;holder.tv_header_title.setText(bean.getHeader());}/*** 绑定FooterViewHolder的数据。** @param holder* @param section 数据源list的下标*/@Overrideprotected void onBindSectionFooterViewHolder(MyFooterViewHolder holder, int section) {MyBean bean = mList.get(section);if (null == bean)return;holder.tv_footer_title.setText(bean.getFooter());}/*** 绑定ItemViewHolder的数据。** @param holder* @param section 数据源list的下标*/@Overrideprotected void onBindItemViewHolder(MyItemViewHolder holder, int section, int position) {MyBean bean = mList.get(section);if (null == bean)return;holder.tv_name.setText(bean.getList().get(position).getContent());GlideApp.with(mContext).load(R.mipmap.group).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).centerCrop().into(holder.iv_head);}/*** ItemViewHolder*/public class MyItemViewHolder extends RecyclerView.ViewHolder {private ImageView iv_head;private TextView tv_name;public MyItemViewHolder(View itemView) {super(itemView);iv_head = (ImageView)itemView.findViewById(R.id.item_iv);tv_name = (TextView)itemView.findViewById(R.id.item_tv_title);}}/*** HeaderViewHolder*/public class MyHeaderViewHolder extends RecyclerView.ViewHolder {private TextView tv_header_title;public MyHeaderViewHolder(View itemView) {super(itemView);tv_header_title = (TextView)itemView.findViewById(R.id.item_header_title);}}/*** FooterViewHolder*/public class MyFooterViewHolder extends RecyclerView.ViewHolder {private TextView tv_footer_title;public MyFooterViewHolder(View itemView) {super(itemView);tv_footer_title = (TextView)itemView.findViewById(R.id.item_footer_title);}}
继承SimpleSectionedAdapter:
/*** @Description: 简单用法 没有footer* @author: ZhangYW* @time: 2019/1/24 9:38*/
public class SimpleHeaderAdapter extends SimpleSectionedAdapter<SimpleHeaderAdapter.MyItemViewHolder> {private Context mContext;private List<MyBean> mList;public SimpleHeaderAdapter(Context context, List<MyBean> list) {this.mContext = context;this.mList = list;}@Overrideprotected String getSectionHeaderTitle(int section) {return mList.get(section).getHeader();}/*** header或者footer的个数* @return*/@Overrideprotected int getSectionCount() {return mList.size();}/*** 每个header或者footer中包含具体的内容个数* @return*/@Overrideprotected int getItemCountForSection(int section) {return mList.get(section).getList().size();}@Overrideprotected MyItemViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_rv_content, parent, false);return new SimpleHeaderAdapter.MyItemViewHolder(itemView);}@Overrideprotected void onBindItemViewHolder(MyItemViewHolder holder, int section, int position) {MyBean bean = mList.get(section);if (null == bean)return;holder.tv_name.setText(bean.getList().get(position).getContent());GlideApp.with(mContext).load(R.mipmap.group).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).centerCrop().into(holder.iv_head);}/*** ItemViewHolder*/public class MyItemViewHolder extends RecyclerView.ViewHolder {private ImageView iv_head;private TextView tv_name;public MyItemViewHolder(View itemView) {super(itemView);iv_head = (ImageView)itemView.findViewById(R.id.item_iv);tv_name = (TextView)itemView.findViewById(R.id.item_tv_title);}}
}
下载地址:TestSectionedRecyclerView
如果没有积分,请点这里github:TestSectionedRecyclerView
RecyclerView实现按时间分组手机相册效果相关推荐
- android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(一)
第二篇文章链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(二) 效果图: 前言 之前看到这种效果如果用recyclerview来实现没有一点思路, ...
- android RecyclerView一步步打造分组效果、类似QQ分组、折叠菜单、分组效果(二)
第一篇链接: android RecyclerView一步步打造分组效果.类似QQ分组.折叠菜单.分组效果(一) 注!已更新代码! 上一篇写了分组效果的初步实现: 这一篇就继续增加分组折叠效果和基类的 ...
- android 相册相似图片,这样整理手机相册,容易引起极度舒适
原标题:这样整理手机相册,容易引起极度舒适 手机拍照非常方便,大家平常都喜欢随手拍下各种照片去记录生活:此外,手机也常用来拍文件.笔记.PPT:还有屏幕截图.网络图片.表情包--日积月累整个相册凌乱不 ...
- 三星手机怎么恢复删除的图片_手机相册照片突然删除了怎么恢复?这个方法好用...
生活中很多感情的沟通都是通过照片传达的,在微信斗图,在qq分享照片.和朋友聚会拍照留念等等,那么手机照片突然没了还能找回来吗? 情景一:手机相册照片突然删除了怎么恢复 大家平时都喜欢玩自拍.抖音等小视 ...
- recyclerview 分组_Android使用RecyclerView实现跨列分组
效果图: 需求分析: 如上图所示,这是一个展示年级及学期的界面.年级分为三组高中.初中和小学.因学期太多若按一个一个控件的写既繁琐又不够优雅,所以我采用 RecyclerView配合分组来实现效果.注 ...
- jquery 实现智能炫酷的翻页相册效果
jquery 实现智能炫酷的翻页相册效果 巧妙的运用 Html 的文档属性,大大减少jquery 的代码量,实现了智能炫酷的翻页相册.兼容性很好,实现了代码与标签的完全分离 1. [代码]jquer ...
- vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...
随着国产手机的发展,手机像素越来越高,里面的功能也越来越丰富,手机拍照成了不少人的日常,如果你很爱拍照,手机里有一大堆照片,那么教你用手机自带的相册功能,一键将照片制作成电影,自带背景音乐,好看还很高 ...
- 相册权限_手机相册太乱?1分钟教你快速管理自己的照片,非常好用!
喜欢拍照的朋友们是不是有这样一个烦恼,那就是手机里拍了很多照片,当你想找某一张照片时你得在手机里翻半天,费时费力,那么今天我就来给大家解决这个烦恼, 手机相册是手机中必不可少的,那当我们手机照片太多时 ...
- 手机900e模式如何救_手机护眼模式真的有用吗?长时间看手机如何保护视力?...
[智友问答]手机护眼模式真的有用吗?长时间看手机如何保护视力 最近笔者刚刚更换了新手机,有一天在使用过程无意中碰到了某个开关,屏幕颜色变成了淡淡的黄色,等反应过来才明白碰到了护眼模式的开关,手机上的护 ...
最新文章
- DATEIF实例说明5
- activiti源码编译
- Hive group by实现-就是word 统计
- 算法导论之平摊分析(动态表)
- Spring Boot自动配置原理
- EventBus3.0 List事件遇到的坑
- 基本符号有_MapGIS 10中各种比例尺、符号尺寸计算说明(三)——随图缩放的符号计算...
- 【Java】7.1 与用户互动 7.2 系统相关
- PHP内核探索:新垃圾回收机制说明
- Iframe难点备忘
- mysql5.6 with as 用法_python面试专题with 关键字与上下文管理
- 深度学习中常说的向量和表示
- 恒大贾跃亭和解;快播处罚细节曝光;天津三星工厂关闭 | 极客头条
- Node.js 应该用在什么地方
- 软件开发技术文档编写规范
- w10连接远程计算机控制,Win10远程桌面连接如何开启,3种方式助你远程控制
- 洛谷P2386放苹果
- VCL语法教程——5.手持式1311编程器的支持
- 用c语言求20以内的勾股数,C语言求勾股数代码及解析
- 久处不厌,闲谈不烦。从不敷衍,绝不怠慢
热门文章
- 小米新手机鸿蒙系统,安卓终于被抛弃了!迎来鸿蒙系统新时代:结果小米新系统惨遭吐槽...
- 简单几步优化你的windows,加快开机速度(重装windows之后要做的几件事)
- 计算机语言送祝福,二十种编程语言齐送鼠年祝福
- cpu要和gpu搭配吗_显卡和CPU可以随便搭配吗?
- Linux使用ImageMagick下的convert命令转换图片格式
- C. Train and Queries
- 自带超多工具,好用又免费,这3款手机浏览器你用过了吗
- 基于java网上童装销售系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
- iOS上使用自定义ttf字体
- 深入理解Servlet