对具有不同对象的arraylist进行排序

时间:2017-04-16 03:11:55

标签: java android collections

我是stackoverflow的新手。

这是我的问题

这是关于Android的。我正在实现具有异构布局的Recycler视图。我正在向它传递静态数据。因此,如果它的布局A它需要对象A数据。如果它的布局B它需要对象B数据,依此类推。

示例:

List.add(new A("May 27",2,3000$));

List.add(new B("April 21",2,"Place1",2000$));

List.add(new c("March 20","from place","toplace",5000$));

我的问题是如何根据我们为每个对象传递的日期对Recyclerview进行排序。假设“3月20日”首先出现,因此它必须出现在recyclerview的顶部,“5月27日”应显示在Recyclerview的最后。

我可以通过传递列表和比较器接口的实现作为第二个参数来使用Collections.sort()。通过取走日期字段并将其插入父类D并使类A,B,C继承D类,但它不适用于我的情况。

Class D {

    private String date;

    // getter and setter method

}

Class A extends D{}

Class B extends D{}

Class C extends D{}

IN RecyclerViewAdapter

//onCreateViewHolder()


//OnBindViewHolder()

//getiewType()


//Creating list of data

private ArrayList<Object> getData(){

        ArrayList<Object> list = new ArrayList<>();

        for(int i=0;i<=20;i++) {

            list.add(new A("MAY 23", 1, 3000$));

            list.add(new B("April27", 1, 2, 3400$));

            list.add(new C("New york" "March 28", 1000$, 2, 2));

        }


    Collections.sort(list, new Comparator<D>() {

        @Override
        public int compare(D l1, D l2) {

            SimpleDateFormat sdf = new SimpleDateFormat("MMM dd", Locale.ENGLISH);

            Date d1=null;
            Date d2= null;

            try {
                d1=sdf.parse(String.valueOf(l1.getDate()));

                 d2= sdf.parse(String.valueOf(l2.getDate()));

             } catch (ParseException e) {

                e.printStackTrace();
            }

            if(d1 != null && d1.after(d2)){

                return -1;

            }else{

                return 1;}
            }

        return 0;

##错误“意外令牌”///或者如果在这里做某事它会将整个块##显示为错误:

第二个参数错误

找到:java.util.comparator(D)

必需:java.util.comparator(Object)

    });

    return list;

}

有人可以帮我解决这个问题。提前致谢

2 个答案:

答案 0 :(得分:1)

如果你通过了正确的比较器,你应该得到你想要的输出。它应该是这样的:

Collections.sort(list, new Comparator<ListType>() {
    @Override
    public int compare(ListType l1, ListType l2) {
        return l1.getDate().compareTo(l2.getDate());
    }
}); 

如果它不起作用,请检查您是否正确设置了日期。我看到你在这里将日期作为字符串传递。在将其设置为日期时,您是否正确解析它?

修改

您未正确解析日期。要解析这些日期

May 27
April 21
March 20

您应该使用:

...
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd", Locale.ENGLISH);
...

答案 1 :(得分:0)

最后我得到的答案是我的解决方案

解决方案在Comparator中传递Object类并将其类型转换为ClassD:)

private ArrayList getData(){

chr22 (tab) 42132048 (tab) 42132049 (tab) NC_000022.11:42132048_42132049insTT

chr1 42132048 (tab) 42132048 (tab) 42132049 (tab) NC_000001.11:42132048_42132049delTT

} 返回清单;