2017-04-07 46 views
0

我試圖理清我與它Arrayadapter輔助排序的排序方法上ArrayAdapter

@Override 
public void sort(@NonNull Comparator<? super Task> comparator) { 
    super.sort(comparator); 
} 

兩次。

我用兩個比較

private static final Comparator TASKCOMPARATOR_TITLE = new Comparator<Task>() { 
    @Override 
    public int compare(Task a, Task b) { 
     return a.getTitle().compareToIgnoreCase(b.getTitle()); 
    } 
}; 

private static final Comparator TASKHOLDERCOMPARATOR_DUEDATE = new Comparator<ViewHolder>() { 
    @Override 
    public int compare(ViewHolder a, ViewHolder b) { 
     return a.getTask().getDueTime().compareTo(b.getTask().getDueTime()); 
    } 
}; 

這樣

taskAdapter.sort(Util.getTASKCOMPARATOR_TITLE()); 
taskAdapter.sort(Util.getTASKCOMPARATOR_DUEDATE()); 

由標題,然後通過日期希望輔助排序一個ArrayAdapter。排序法一個ArrayAdapter的內部使用

public void sort(Comparator<? super T> comparator) { 
    synchronized (mLock) { 
     if (mOriginalValues != null) { 
      Collections.sort(mOriginalValues, comparator); 
     } else { 
      Collections.sort(mObjects, comparator); 
     } 
    } 
    if (mNotifyOnChange) notifyDataSetChanged(); 
} 

我讀過,那Collections.sort()是使用穩定的算法,因此我不知道爲什麼我的ArrayAdapter的名單只是被排序我調用的最後一個比較器。

有誰能告訴我我犯了什麼錯誤,爲什麼第一個sort() - 調用被第二個忽略?

編輯

private static final Comparator TASKCOMPARATOR = new Comparator<Task>() { 
    @Override 
    public int compare(Task a, Task b) { 
     int timeCompareResult = a.getDueTime().compareTo(b.getDueTime()); 
     if (timeCompareResult == 0) { 
      return a.getTitle().compareToIgnoreCase(b.getTitle()); 
     } else { 
      return timeCompareResult; 
     } 
    } 
}; 

這工作。我不知道這是否是唯一/最好的方法。

+0

只需使用一個比較和排序由兩個參數存在。如果標題相同,則按日期排序。這是基本的。你也可以抽象它,並寫通用比較器,接受兩個內部比較器。 –

回答

0

正如所述,使用一個比較器。 比較器在等於時返回0。 首先比較標題,如果他們相同,你去比較時間。 我沒有跑的代碼,但它應該是這樣的:

private static final Comparator TASKHOLDERCOMPARATOR_DUEDATE = new Comparator<ViewHolder>() { 
    @Override 
    public int compare(ViewHolder a, ViewHolder b) { 
     int comparison = a.getTask().getTitle().compareToIgnoreCase(b.getTask().getTitle()); 

     if(comparison == 0){ 
      comparison = a.getTask().getDueTime().compareTo(b.getTask().getDueTime()); 
     } 
     return comparison; 
    } 
};