您的位置:首页 > 移动开发 > Android开发

根据时间按年、月、日、分组、排序

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,上传上去之后下载下来也是乱码,唉,最后,有不同见解的朋友欢迎留言,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息