2013-09-17 5 views
3

Я пытаюсь выполнить сортировку нескольких столбцов в своем приложении.GWT: сортировка нескольких столбцов

Как я быть_наст ПгвЬЫат, фамилия колонка

Прямо сейчас, когда я нажимаю на заголовке ПгвЬЫата, сортирует согласно FirstName, когда я нажимаю на LastName колонки сортирует согласно колонку LastName ..

то, что мне нужно, когда я нажимаю на заголовок первого имени, он должен сортироваться по первому имени, а затем, если я нажму на заголовок lastname (со сдвигом или любой другой), он должен сортироваться на основе как firstname, так и lastname, firstname как первичный столбец и фамилия в качестве дополнительной сортировочной колонны

вот что у меня есть

private void sortTableUsers(List<UserDTO> userList){ 

    ListDataProvider<UserDTO> dataProvider = new ListDataProvider<UserDTO>(); 
    dataProvider.addDataDisplay(usersTable); 

    List<UserDTO> list = dataProvider.getList(); 

    for (UserDTO UserDTO : userList) { 
    list.add(UserDTO); 
    } 
    final ListHandler<UserDTO> columnSortHandler = new ListHandler<UserDTO>(list); 

     columnSortHandler.setComparator(firstNameColumn,new Comparator<UserDTO>() { 

     public int compare(UserDTO o1,UserDTO o2) { 
     if (o1 == o2) { 
     return 0; 
     } 

     // Compare the firstname columns. 
     if (o1 != null) { 

     return (o2 != null) ? o1.getUser().getFirstName().compareTo(o2.getUser().getFirstName()) : 1; 
     } 
     return -1; 
     } 
     }); 


    columnSortHandler.setComparator(lastNameColumn,new Comparator<UserDTO>() { 

     public int compare(UserDTO o1,UserDTO o2) { 
     if (o1 == o2) { 
     return 0; 
     } 

     // Compare the lastname columns. 
     if (o1 != null) { 

     return (o2 != null) ? o1.getUser().getLastName().compareTo(o2.getUser().getLastName()) : 1; 
     } 
     return -1; 
     } 
     }); 


     usersTable.getColumnSortList().push(firstNameColumn); 
     usersTable.getColumnSortList().push(middleNameColumn); 
} 
+1

Как это обычно делается в том, что при нажатии на FirstName, и затем в lastname (не требуется никакой клавиши shift), тогда lastname становится основным (!) критерием сортировки, а firstname - вторичным (что довольно интуитивно, когда вы его пытаетесь). Обычно это достигается с помощью [стабильных алгоритмов сортировки] (http://en.wikipedia.org/wiki/Category:Stable_sorts). –

+2

Возникает вопрос о заголовке, который должен улавливать нажатой клавишу сдвига или о алгоритме сортировки? – otonglet

+2

@ChrisLercher: и если я не ошибаюсь, это именно то, что делает вышеуказанный код («ListHandler» обновляет список на месте, вместо того, чтобы возвращаться из «несортированного» списка и использует 'Collections.sort()' который гарантирует стабильный вид). –

ответ

2

Ну, для каждого столбца нужен другой компаратор, второй компаратор - тот, который вам нужно изменить. Сначала он должен сортировать для FirstName, и если первые имена равны, то продолжайте и сравните фамилии. Я не использую свой DTO, и я не проверять нули, но это то же самое, вы получите идею

ArrayList<Map> list = new ArrayList<Map>(); 
ListHandler<Map> _sortHandler = new ListHandler<Map>(list); 

Column columnDefinitionFirstName = null; // create your column first name 
columnDefinitionFirstName.setSortable(true); 

// 
_sortHandler.setComparator(columnDefinitionFirstName, new Comparator<Map>() 
{ 
    public int compare(Map o1, Map o2) 
    { 
     int res = 0; 

     String object1 = (String) o1.get("FIRST_NAME"); 
     String object2 = (String) o2.get("FIRST_NAME"); 

     res = object1.compareTo(object2); 

     return res; 
    } 
}); 



Column columnDefinitionLastName = null; // create your column last name 
columnDefinitionLastName.setSortable(true); 



_sortHandler.setComparator(columnDefinitionLastName, new Comparator<Map>() 
{ 
    public int compare(Map o1, Map o2) 
    { 
     int res = 0; 

     String object1 = (String) o1.get("FIRST_NAME"); 
     String object2 = (String) o2.get("FIRST_NAME"); 

     res = object1.compareTo(object2); 

     if(res == 0) 
     { 
      String object11 = (String) o1.get("LAST_NAME"); 
      String object22 = (String) o2.get("LAST_NAME"); 

      res = object11.compareTo(object22); 
     } 

     return res; 
    } 
}); 
Смежные вопросы