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

一、引发条件

前两天我同学说他很忙,有一个效果不知道怎么做让我给他看看,他说看我一天闲的很,所以让我帮他做做这个效果,不多说直接看效果图

看到这个大家都知道吧,其实就是一个相册的显示效果,他说不会分组排序,然后让我给他看看,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);
                            }
                        } 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,上传上去之后下载下来也是乱码,唉,最后,有不同见解的朋友欢迎留言,谢谢

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值