根据时间栏排列cutom Arraylist

时间:2018-02-19 11:12:07

标签: android

我有一个自定义arraylist,其中包含多个参数以及时间。

我想根据asending和desending格式的时间参数对该列表进行排序

我搜索了很多 这是一些链接 Sort objects in ArrayList by date?

Sort ArrayList with times in Java

还有更多 但没有一个工作

这是我的代码

功能调用点击

 private void callTimeSorting(ArrayList<ObjectClass>solutions){
    try{
        ArrayList<ObjectClass> tempList = new ArrayList<>();
        if (tempList.size() > 0){tempList.clear();}
        tempList.addAll(solutions);
        if (mTimeTag == 1) {
            if (!mAsendingTime) {
                Collections.sort(tempList, AsendingTimeComparator);
                mAsendingTime = true;
                mAdapter.notify();
            } else {
                Collections.sort(tempList, DesendingTimeComparator);
                mAsendingTime = false;
            }

        }
 }

OnClick方法

 @Override
public void onClick(View view) {
    int id = view.getId();
    switch (id) {
       case R.id.tvTimings :
            mTimeTag =  1 ;
            callTimeSorting(mSolutions) ;
            mAdapter.notifyDataSetChanged();
            break;


 }}

AsendingComparator

  private static Comparator<ObjectClass> AsendingTimeComparator = new Comparator<ObjectClass>() {
    @Override
    public int compare(ObjectClass solution1, ObjectClass solution2) {
        String time1 = solution1.getDepartureDateTime();
        String time2 = solution2.getDepartureDateTime();
        return time1.compareTo(time2);//asending
    }
};

private static Comparator<ObjectClass> DesendingTimeComparator = new Comparator<ObjectClass>() {
    @Override
    public int compare(ObjectClass solution1, ObjectClass solution2) {
        String time1 = solution1.getDepartureDateTime();
        String time2 = solution2.getDepartureDateTime();
        return time2.compareTo(time1);//descending

    }



};

我不知道为什么我的排序列表没有附加到recyclerView ??

3 个答案:

答案 0 :(得分:3)

使用适配器中使用的原始列表,而不是临时列表

 private void callTimeSorting(ArrayList<ObjectClass>solutions){
        try{
            ArrayList<ObjectClass> tempList = new ArrayList<>();
            tempList.addAll(solutions);
            solutions.clear();
            if (mTimeTag == 1) {
                if (!mAsendingTime) {
                    Collections.sort(tempList, AsendingTimeComparator);
                    mAsendingTime = true;
                } else {
                    Collections.sort(tempList, DesendingTimeComparator);
                    mAsendingTime = false;
                }
              solutions.addAll(tempList);
              mAdapter.notifyDataSetChanged();
            }
     }

答案 1 :(得分:2)

您的列表未进行排序,因为您正在对tempList进行排序:

Collections.sort(tempList, AsendingTimeComparator);

而不是您的适配器使用的实际列表,即解决方案。

您不应该使用临时列表并直接对解决方案进行排序。

private void callTimeSorting(ArrayList<ObjectClass>solutions){
    try{
        if (mTimeTag == 1) {
            if (!mAsendingTime) {
                Collections.sort(solutions, AsendingTimeComparator);
                mAsendingTime = true;
                mAdapter.notify();
            } else {
                Collections.sort(solutions, DesendingTimeComparator);
                mAsendingTime = false;
            }

        }
 }

答案 2 :(得分:1)

使用mList的参考 ....在您的代码中不要再次初始化它..使用clear()代替new Arraylist<>并且不要将任何其他引用分配给列表如list = new_List;

mAdapter将失去对列表的引用...并且不会相应地工作..(notifyDataSetChanged()将不起作用。