在android中使用两个日期对象对数组列表进行排序

时间:2015-08-24 06:47:02

标签: android listview comparator

我有一个带有自定义对象的ArrayList。每个对象都有两个日期实体Call dateAppointment date。此信息(以及其他信息)显示在列表视图中,到目前为止一切正常。

Call date永远不会为空,并且始终是来自服务器的有效日期。但是,对于少数条目,Appointment date可以为null。 Call dateAppointment date的日期格式相同(Thu Jan 01 00:00:00 GMT 1970)

排序应该是这样的:

  • Call date应按日期降序排序

  • 约会日期,如果不是null,则应显示在最上方。但是,它必须按日期的升序排序(例如:如果8月19日有两个约会,8月21日有另一个约会,8月19日应该显示在顶部和21下面)并且所有空值应该在底部

目前,我已经使用两个单独的比较器对Call dateAppointment date进行了排序。但是,Appointment date按降序排列,而不是按升序排列(第21位显示在顶部,第19位在其下方,最后显示为空)。

比较器代码低于

    public class CallDateComparator implements Comparator< ListModel > {
        @Override
        public int compare(ListModel o1, ListModel o2) {
            if (o2.getCallDate() != null && o1. getCallDate() != null)
                return o2.getProspectDate().compareTo(o1.getProspectDate());
            else
                return 0;
        }
    }

    public class AppointmentDateComparator implements Comparator< ListModel > {
        @Override
        public int compare(ListModel o1, ListModel o2) {
            if (o2.getAppointmentDate() != null && o1.getAppointmentDate() != null)
                return o2.getAppointmentDate().compareTo(o1.getAppointmentDate());
            else
                return 0;
        }
    }

我通过调用

ArrayList进行排序
Collections.sort(myList, new CallDateComparator());
Collections.sort(myList, new AppointmentDateComparator());

上面需要更改的内容才能使约会日期按升序排序,如果它为空,只需保留早期的排序吗?

1 个答案:

答案 0 :(得分:1)

我的方法基于评论的格式:

基本上我会做一个更大的比较器,而不是两个不同的比较器。

 public class CallDateComparator implements Comparator< ListModel > {
        @Override
        public int compare(ListModel o1, ListModel o2) {
            if (o2.getCallDate() != null && o1. getCallDate() != null)
                int i = o1.getProspectDate().compareTo(o2.getProspectDate();
                switch (i)
                  case -1: //o1 smaller than o2
                      return -1;
                    break;//this might be not necessary at all.
                  case 0: //both equal, so, same call date.
                        if(o1.getAppointmentDate() != null && o2.getAppointmentDate() == null)
                        {
                          return 1; // make o1 the bigger one.
                        }
                        else if(o1.getAppointmentDate() == null && o2.getAppointmentDate() != null)
                        {
                          return -1; // make o2 the bigger one.
                        }
                        else if(o1.getAppointmentDate() == null && o2.getAppointmentDate() == null)
                        {
                           return 0; //both are equally null.
                        }
                        else
                        {
                            return o1.getAppointmentDate().compareTo(o2.getAppointmentDate()); //compare then
                        }

                    break;
                  case 1: //o1 bigger than o2
                      return 1;
                    break;//this might be not necessary at all.
                  default:
                      return 0;
                    break;
            else
                return 0;
        }
    }