最近笔者在做一个项目。需求里面有一个效果是一个ListView:按带日期标题(格式:yyyy-MM-dd)分类,item为(格式:HH:mm:ss),并且在滑动过程中,当日期标题滑动到顶部的时候,进行悬浮;下一个日期标题到达顶部的时候把前一个header顶上去,废话不多少,先上效果图。

首先是需求想要实现的效果,仿虎扑体育。

然后是笔者实现的效果(因为项目还未上线,显示内容涉及到公司一些东西,因此显示的内容就马赛克了一下,不好意思):

接下来说一下,这种效果需要实现的难点吧:

1.自定义listview,实现sectionItem和contentItem的区分,并将sectionItemj进行滑动监听,在顶部进行悬浮,并进行悬浮在顶部的阴影绘制(为了有悬浮的视觉效果真实感)。(注:该自定义view参照Github上开源项目PinnedSectionListView。在末尾:笔者会贴出带下拉刷新、上拉加载的listview和不带刷新的listview的demo.在这里自定义控件的细节就不做说明了,demo里面有详细的中文注释,有兴趣的童鞋可以看看,相信大家都能看懂。O(∩_∩)O~)

这里笔者重点分享一下如何把一个arraylist集合里面的所有数据按照某一固定的类型添加分类(分组),最后将所有数据按照分类进行整理,遍历显示。

1、ArrayList集合里面的数据:

因为这边从后台接收到的item的json数据日期格式为:yyyy-MM-dd HH:mm:ss;按照(yyyy-MM-dd为header,滑动到顶部要进行悬浮),(HH:mm:ss为正常的item,滑动到顶部不需要悬浮)进行重新分类。

2、实现思路:

其实实现也很简单!这里要利用到Map的特性。没错,猜大家已经想到了。key,String,键值对的形式来实现。具体:ArrayList里面的每条数据都含有yyyy-MM-dd HH:mm:ss。因此,我们把yyyy-MM-dd设成Map的key,凡是属于这一天的data都放在这个key下面。那么ArrayList所有的data都按照日期yyyy-MM-dd进行了分类。但是Map没办法在listview里面setAdapter呀。到了这一步就好办了,那就把Map(含Key)所有的数据都遍历出来,重新加入到一个ArrayList里面。

3、关键代码:

首先,是时间转换为yyyy-MM-dd和HH:mm:ss的工具类:

/*** 返回 yyyy-MM-dd* * @param String 参数为String类型yyyy-MM-dd HH:mm:ss* @return 返回 yyyy-MM-dd* @throws ParseException */public static String exchangeStringDate(String date) throws ParseException {if (date != null && date.length() > 10) {String result = date.substring(0, 10);return result;}else{return null;}}/*** 返回HH:mm:ss* * @param String 参数为String类型* @return 返回HH:mm:ss* @throws ParseException */public static String exchangeStringTime(String date) throws ParseException {if (date != null && date.length() > 10) {String result = date.substring(10, date.length());return result;}else{return null;}}

第二个是,通过HashMap键值对的特性,将ArrayList的数据进行分组,返回带有分组Header的ArrayList。

        /*** 通过HashMap键值对的特性,将ArrayList的数据进行分组,返回带有分组Header的ArrayList。* @param details 从后台接受到的ArrayList的数据,其中日期格式为:yyyy-MM-dd HH:mm:ss* @return list  返回的list是分类后的包含header(yyyy-MM-dd)和item(HH:mm:ss)的ArrayList*/@SuppressWarnings({ "rawtypes", "unchecked" })public static ArrayList<PinnedSectionBean> getData(List<WarnDetail> details){//最后我们要返回带有分组的list,初始化ArrayList<PinnedSectionBean> list = new ArrayList<PinnedSectionBean>();//时间转换的util类TimeManagement management = new TimeManagement();//WarnDetail作为key是yyyy-MM-dd格式,List<WarnDetail>是对应的值是HH:mm:ss格式Map<WarnDetail, List<WarnDetail>> map = new HashMap<WarnDetail, List<WarnDetail>>();//按照warndetail里面的时间进行分类WarnDetail detail = new WarnDetail();for (int i = 0; i < details.size(); i++) {try {String key = management.exchangeStringDate(details.get(i).getAddtime()) ;if (detail.getAddtime() != null && !"".equals(detail.getAddtime())) {//判断这个Key对象有没有生成,保证是唯一对象.如果第一次没有生成,那么new一个对象,之后同组的其他item都指向这个keyboolean b = !key.equals(detail.getAddtime().toString());if (b) {detail = new WarnDetail();}}detail.setAddtime(key);//把属于当天yyyy-MM-dd的时间HH:mm:ss全部指向这个keyList<WarnDetail> warnDetails = map.get(detail);//判断这个key对应的值有没有初始化,若第一次进来,这new一个arryalist对象,之后属于这一天的item都加到这个集合里面if (warnDetails == null) {warnDetails = new ArrayList<WarnDetail>();}String time = details.get(i).getAddtime();time = management.exchangeStringTime(time);details.get(i).setAddtime(time);warnDetails.add(details.get(i));map.put(detail, warnDetails);} catch (ParseException e) {e.printStackTrace();}}//用迭代器遍历map添加到list里面Iterator iterator = map.entrySet().iterator();while (iterator.hasNext()) {Map.Entry entry = (Entry) iterator.next();WarnDetail key = (WarnDetail) entry.getKey();//我们的key(yyyy-MM-dd)作为标题.类别属于SECTIONlist.add(new PinnedSectionBean(SECTION, key));List<WarnDetail> li = (List<WarnDetail>) entry.getValue();for (WarnDetail warnDetail : li) {//对应的值(HH:mm:ss)作为标题下的item,类别属于ITEMlist.add(new PinnedSectionBean(ITEM, warnDetail));}}//把分好类的hashmap添加到list里面便于显示return list;}

备注:其中WarnDetail是我们的ListView显示item的实体类,大家可以根据自己具体的项目进行替换.其次,分类的类别是灵活多变的,可以按照时间分类,也可以按照地点分类,或者按照WarnDetail里面某一项数据进行分类.只要掌握Map键值对进行分类的思想,即可进行拓展延伸.

特别提醒:对于item的点击事件:关于setItemOnclickListener中postion的问题,除了arg2-1 = postion以外,记得数据data是分类转换后的real_data哈.否则会有脚标越界的Exception.和点击item跳转错误的bug.

最后,是笔者做的另外一个效果图,按照地点分类的list.贴上来给大家参考一下.(*^__^*)

;;

最后当然是源码,带下拉刷新、上拉加载的listview,按照日期分类.点击下载

不带刷新的listview,按照日期分类.点击下载

demo效果图:

;

友情提示:如果你还想再对list里面的数据进行排序,可以用Comparator进行排序.笔者就不再重复了,网上有很多相关资料介绍,有需求的童鞋可以Google一下.

第一次发布博客,稍微有点紧张,如有有纰漏,欢迎各位看官指出,大家一起相互学习,有问题的话,欢迎留言,我会一一给大家回复的.

Anroid(仿虎扑体育)ListView中数据按照时间\日期分组(分类)相关推荐

  1. 关于虎扑体育的创新点

    关于虎扑体育: 虎扑体育成立于2004年,是中国资源优势及营销实力的专业体育营销公司. 虎扑体育旗下拥有中国的体育网站--虎扑体育网.经过十年的发展与积累,虎扑已成为集体育营销策划.赛事营销与管理.活 ...

  2. 北乔峰南慕容:懂球帝与虎扑体育的“武功”较量

    2018年可谓是体育社区平台的春天,因为世界杯.亚运会等大型体育赛事的举办,让人们对体育的关注度达到了顶峰.从赛事开始前.进行中.到结束,人们对体育的热情不仅仅表现在赛场上,在可对体育进行话题交流和分 ...

  3. android基于MVP小说网络爬虫、宝贝社区APP、仿虎扑钉钉应用、滑动阴影效果等源码...

    Android精选源码 android宝贝社区app源码 android仿Tinder最漂亮的一个滑动效果 android仿滴滴打车开具页,ListView粘性Header Android基于MVP模 ...

  4. android基于MVP小说网络爬虫、宝贝社区APP、仿虎扑钉钉应用、滑动阴影效果等源码

    Android精选源码 android宝贝社区app源码 android仿Tinder最漂亮的一个滑动效果 android仿滴滴打车开具发票页,ListView粘性Header Android基于MV ...

  5. 发自虎扑体育android客户端,阿德问题(转自虎扑)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 开头引用一个刺密的一段在新闻区的评论"呆子退役后,马刺也好,刺密也好都失去了二十年以来一直撑起球队的精神领袖,再加上秃子也行将退役,傻帕状态也日 ...

  6. 八点钟学院:由“虎扑体育app”的这个效果,来谈谈UITableView编辑模式

    作为一名jr,虎扑体育几乎是我每天都得打开的app,赛季期间自不必说,长草期也喜欢看看八卦和交易动态. 那么,我们来看看这款app里的这个效果图: 八点钟学院:谈谈UITableView编辑模式 这是 ...

  7. TLint for 虎扑体育应用源码项目

    虎扑非官方客户端TLint 全新Material Design设计,简洁美观 支持论坛全部操作,浏览帖子.点亮.回复.引用.收藏等 多项个性化设置(不同主题,不同阅读模式) TLint For 虎扑体 ...

  8. TLint for 虎扑体育 基于Dagger2+RxJava+Retrofit开发,采用MVP模式

    TLint 类别: 完整源码 打分: ★★★★★ 更新: 2016-05-12 09:54 大小: 6976 kb 开发环境: Android Studio 浏览: 484 次 下载: 83 次 项目 ...

  9. 【Python爬虫系列教程 11-100】Python网络爬虫实战:最简单的Pandas 中的read_html一行代码爬取网页表格型数据,就可以爬取虎扑体育NBA球员信息

    文章目录 爬取对象 分析 实现代码 爬取对象 虎扑是一个认真而有趣的社区,每天有众多JRs在虎扑分享自己对篮球.足球.游戏电竞.运动装备.影视.汽车.数码.情感等一切人和事的见解,热闹.真实.有温度. ...

最新文章

  1. netcore读取json文件_.net core读取json格式的配置文件
  2. tf.matmul() 和tf.multiply() 的区别
  3. python真的这么厉害吗-Python为什么这么厉害?——Python ,能用来做什么
  4. jQuery学习笔记——事件
  5. 杭州线下|2019产品经理年终轰趴
  6. SMW0上传模板下载到本地
  7. java xml签名_Java使用DSA密钥对生成XML签名的方法
  8. python新手入门英文词汇笔记(1-1)_Python新手入门英文词汇(1-1)
  9. 基于Kubeadm的Flannel分析
  10. 初学者python笔记(内置函数_1)
  11. exchange2003的简单安装方法
  12. nodejs笔记五--MongoDB基本环境配置及增删改查;
  13. Flutter进阶第8篇:实现视频播放
  14. 如何防止google map 加载Roboto字体
  15. 修复桌面快捷方式箭头图标
  16. [深度学习]基于TensorFlow的基本深度学习模型
  17. 文件服务器索引服务,ftp服务器文件索引
  18. vue-cli 3 和 vue-cli 2的区别[转]
  19. python编程技巧
  20. October 20th 2017 Week 42nd Friday

热门文章

  1. GCDAsyncSOcket使用及其SSL/TLS双向认证的实现
  2. android 辅助功能 长按发语音,简单模拟微信长按语音发送效果
  3. 为何华为的5G专利高居第一名,却还被高通要求缴纳专利费?
  4. 微信怎么批量自动添加好友?
  5. 使用Pelican在Github(国外线路访问)和Coding(国内线路访问)同步托管博客
  6. HNUST OJ 1883 神奇的序列
  7. 网格交易 python代码_两小段代码轻松搞定网格交易法
  8. 图大杀猫:数据可视化的真善美
  9. 基于java电影票预订管理系统设计与实现
  10. Redis并发问题(雪崩、击穿、穿透)