根据时间按年、月、日、分组、排序
2016-06-04 10:47
465 查看
一、引发条件
前两天我同学说他很忙,有一个效果不知道怎么做让我给他看看,他说看我一天闲的很,所以让我帮他做做这个效果,不多说直接看效果图看到这个大家都知道吧,其实就是一个相册的显示效果,他说不会分组排序,然后让我给他看看,ok,废话不多说,开始解说。
二、题外话
在写代码之前一定搞清楚原理,这是个很重的过程,现在好多写代码的初学者都是看到效果就直接拷贝复制,不去考虑实现过程及原理,导致出问题了也不知道怎么改,所以搞清楚实现过程及原理很重要,切记。三、原理及实现过程
原理:看到上边效果图可以想到两点首先是时间的分组
其次才是时间的排序
然后就是数据以及图片的显示问题了,额,对了,这个地方还是涉及到一个图片的处理问题,个人感觉imageloader这个处理图片的框架确实不错,有兴趣想偷懒的童鞋可以去试试,好了这个地方我就不做图片的处理,直说数据的分组排序
实现过程:
先定义一个实体类(CssFiles),用于存放数据,注意这个地方的数据结构
public class CssFiles { private String date; private long dateCurrent; private List<FileAttributes> mFileAttributes; public String getDate() { return date; } public void setDate(String date) { this.date = date; } public long getDateCurrent() { return dateCurrent; } public void setDateCurrent(long dateCurrent) { this.dateCurrent = dateCurrent; } public List<FileAttributes> getmFileAttributes() { return mFileAttributes; } public void setmFileAttributes(List<FileAttributes> mFileAttributes) { this.mFileAttributes = mFileAttributes; } static class FileAttributes { //文件下载路径 private String fileUrl; //文件名 private String fileName; //文件类型 private String fileType; private boolean isShow; private boolean isSelect; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getFileType() { return fileType; } public void setFileType(String fileType) { this.fileType = fileType; } public boolean isShow() { return isShow; } public void setShow(boolean show) { isShow = show; } public boolean isSelect() { return isSelect; } public void setSelect(boolean select) { isSelect = select; } public String getFileUrl() { return fileUrl; } public void setFileUrl(String fileUrl) { this.fileUrl = fileUrl; } } }然后是分组、排序类(DateUtils)
public class DateUtils { /** * 时间的显示方式,这个地方按自己的需求来修改, */ private static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); private static SimpleDateFormat sdfy = new SimpleDateFormat("yyyy"); private static SimpleDateFormat sdfyM = new SimpleDateFormat("yyyy-MM"); private static SimpleDateFormat sdfM = new SimpleDateFormat("MM"); private static SimpleDateFormat sdfd = new SimpleDateFormat("dd"); private static SimpleDateFormat sdfMd = new SimpleDateFormat("MM-dd"); private static SimpleDateFormat sdfyMd = new SimpleDateFormat("yyyy-MM-dd"); /** * 按年分组 * * @param dates List<String>图片下载链接 * @return List<CssFiles> * @throws ParseException */ public static List<CssFiles> getYear(List<String> dates) throws ParseException { return getYMD(dates, 1); } /** * 按月分组 * * @param dates List<String>图片下载链接 * @return List<CssFiles> * @throws ParseException */ public static List<CssFiles> getMonth(List<String> dates) throws ParseException { return getYMD(dates, 2); } /** * 按日分组 * * @param dates List<String>图片下载链接 * @return List<CssFiles> * @throws ParseException */ public static List<CssFiles> getDay(List<String> dates) throws ParseException { return getYMD(dates, 3); } /** * 按年月日分组 * * @param dates List<String> * @param ymdtype 1(表示按年分组);2(表示按月分组);3(表示按日分组) * @return List<CssFiles> * @throws ParseException */ public static List<CssFiles> getYMD(List<String> dates, int ymdtype) throws ParseException { // IMG_20160530_103327.jpg 这个是童鞋后台给的数据(有点郁闷,不知他们后台为何只给了这么一个数据) //这个地方就要根据你们自己的数据结构来处理数据了 List<CssFiles> files = new ArrayList<>(); Date date; for (String d : dates) { if (d != null && !d.equals("")) { String[] ds = d.split("_"); date = sdf.parse(ds[1]); String ymd = ""; switch (ymdtype) { //年 case 1: ymd = sdfy.format(date); break; //月 case 2: //如果是当前年份的时候只显示月份不显示年份 if (sdfy.format(date).equals(getCurrentYear())) { ymd = sdfM.format(date); } else {//如果不是当前年份、月份都显示 ymd = sdfyM.format(date); } break; //日 case 3: if (sdfy.format(date).equals(getCurrentYear())) { if (sdfM.format(date).equals(getCurrentMonth())) {//如果是当前月就不显示年和月了,只显示XX日 ymd = sdfd.format(date); } else { ymd = sdfMd.format(date); } 4000 } else {//如果不是当前年份、月份都显示 ymd = sdfyMd.format(date); } break; } //老感觉这个地方效率不高但是就是不知道该怎么才好,知道的可以留言哦,我们可以探讨一下 CssFiles cssFile = null; for (CssFiles csfile : files) { if (ymd.equals(csfile.getDate())) { cssFile = csfile; } } if (cssFile == null) { cssFile = new CssFiles(); cssFile.setDate(ymd); cssFile.setDateCurrent(date.getTime()); cssFile.setmFileAttributes(new ArrayList<CssFiles.FileAttributes>()); files.add(cssFile); } CssFiles.FileAttributes fileAttributes = new CssFiles.FileAttributes(); fileAttributes.setFileUrl(d); fileAttributes.setFileName(d); fileAttributes.setFileType(d.substring(d.lastIndexOf(".") + 1));//截取文件格式 fileAttributes.setSelect(false); fileAttributes.setShow(false); cssFile.getmFileAttributes().add(fileAttributes); } } //冒泡排序(这个不多说,不懂得自己去百度咯) CssFiles[] cf = (CssFiles[]) files.toArray(new CssFiles[files.size()]); CssFiles temp; for (int i = 0; i < cf.length; i++) { for (int j = i + 1; j < cf.length; j++) { if (cf[i].getDateCurrent() < cf[j].getDateCurrent()) { temp = cf[i]; cf[i] = cf[j]; cf[j] = temp; } } } files.clear(); Collections.addAll(files, cf); return files; } /** * 得到当前月分 * * @return String */ public static String getCurrentMonth() { Date date = new Date(); return sdfM.format(date); } /** * 得到当前年分 * * @return String */ public static String getCurrentYear() { Date date = new Date(); return sdfy.format(date); } }
ok到这里就完了,看最后分组、排序的效果图
源码没有哦,重点都在上边了,不是我不上传,主要是公司的电脑的是加密的,MD,上传上去之后下载下来也是乱码,唉,最后,有不同见解的朋友欢迎留言,谢谢
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories