junaidp
junaidp

Reputation: 11201

GWT: multiple column sorting

I am trying to do multiple columns sorting in my application .

Like i have firstname , last name columns

Right now , when i click on firstname header , it sorts as per firstname , when i click on lastname column it sorts as per lastname column..

what i need is when i click on firstname header it should sort on the basis of firstname and then if i click on lastname(with shift or any other option) header it should sort on the basis of both firstname and lastname , firstname as primary column and last name as sub sorting column

here is what i have now

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);
}

Upvotes: 3

Views: 1441

Answers (1)

Spiff
Spiff

Reputation: 4094

Well, you need a different comparator for each column, the second comparator is the one that you need to change. First it must sort for FirstName,and if the firstnames are equal, then go on and compare the last names too. I'm not using your DTO, and i don't check for nulls, but it's the same thing, you get the idea

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;
    }
});

Upvotes: 2

Related Questions