2013-06-16 3 views
0

Я хочу добавить сортировку для столбца в таблицу сотовых с помощью ListHandler. Но он не сортирует. Я не понимаю, почему это не работает. Мой код основан на учебнике GWT. Пожалуйста, предложите мне что-нибудь.Столбец в таблице gwt celltable не сортируется

Contract.java

public class Contract implements Serializable { 
    private int contId; 
    private String contOrgName; 

    //getters and setters... 
} 

Main.java

TextColumn<Contract> orgNameColumn = new TextColumn<Contract>() { 
    @Override 
    public String getValue(Contract contract) { 
    return contract.getcontOrgName(); 
}}; 
orgNameColumn.setSortable(true); 

CellTable<Contract> tableContract = new CellTable<Contract>(); 
tableContract.addColumn(orgNameColumn, "OrgName"); 
ListDataProvider<Contract> contractDataProvider = new ListDataProvider<Contract>(); 
contractDataProvider.addDataDisplay(tableContract); 

GetContractsServiceAsync getContractsService = GWT.create(GetContractsService.class); 
getContractsService.getContracts(new AsyncCallback<List<Contract>>() { 
public void onFailure(Throwable caught) { 
    // Show the RPC error message to the user 
} 
public void onSuccess(List<Contract> result) { 
    contractDataProvider.getList().clear(); 
    contractDataProvider.getList().addAll(result);  
    ListHandler<Contract> columnSortHandler = new ListHandler<Contract>(result); 
    columnSortHandler.setComparator(orgNameColumn, new Comparator<Contract>() { 
    public int compare(Contract o1, Contract o2) { 
    if (o1 == o2) { 
    return 0; 
    } 
    if (o1 != null) { 
    return (o2 != null) ? o1.getcontOrgName().compareTo(o2.getcontOrgName()) : 1; 
    } 
    return -1; 
    } 
}); 
tableContract.addColumnSortHandler(columnSortHandler); 
table.getColumnSortList().push(orgNameColumn); 
} 
}); 

ответ

4

Эй, я был также сталкиваюсь с той же самой проблемой длинного back..Then я должен знать, что ссылка на объект ID отличается тот, который я добавил в таблицу. Как только я получил причину, было очень легко найти решение. Также, пожалуйста, зарегистрируйте свой ListHandler перед добавлением столбца в CellTable.

Примечание редактирования для комментариев:

Там нет ничего плохого в comparator. Проблема все та же. Он отражает неправильный объект в компараторе по сравнению с CellTable.

Пожалуйста, попробуйте заменить код, как показано ниже:

contractDataProvider.getList().addAll(result);  
ListHandler<Contract> columnSortHandler = new ListHandler<Contract>(contractDataProvider.getList()); 
+0

Похоже, ссылка на объект идентификатора является правильным и ListDataProvider имеет правильные данные. Я зарегистрировал ListHandler перед добавлением столбца в CellTable, но это не помогло. У меня есть подозрение, что мой компаратор не работает. Я поставил точки останова для отладчика в строках 'return 0',' return (o2! = Null)? o1.getcontOrgName(). compareTo (o2.getcontOrgName()): 1; ',' return -1; 'и я видел, что они не вызывали. Может быть, проблема в этом компараторе. – zigfridus

+0

Я заменил 'result' на' contractDataProvider.getList() 'в' ListHandler columnSortHandler = новый ListHandler (contractDataProvider.getList()); 'и это помогло. Большое спасибо! – zigfridus

+0

Рад помочь !!! – PVR

0

Попробуйте перенести создание вашего columnSortHandler из метода OnSuccess. Поместите его сразу после создания столбца. На данный момент вы добавляете результаты, прежде чем добавить columnSortHandler. Я думаю, что это неправильный порядок.

0

я мой случай, я сделал мои сортировки так:

private void sortColumn(List<CModel> list) { 
    int count = listOfColumns.size(); //upon adding the columns, i have created a list that will hold all the columns 

    if (list.size() <= 0) { 

     for (int i = 0; i < count; i++) { 
      listOfColumns.get(i).setSortable(false); 
     } 

    } else { 

     for (int i = 0; i < count; i++) { 
      sort(i); 
      dg.redrawHeaders(); 
     } 
    } 
}  

private void sort(int i) { 
    String[] listColHead = { /** list of column headers */ }; 

    Column<CModel,?> column = listCheckoutColumns.get(i); 
    final String valueToCompare = listColHead[i]; 

    final ListDataProvider<CModel> dataProvider = new ListDataProvider<CModel>(); 

    // Connect the table to the data provider 
    dataProvider.addDataDisplay(dg); 

    // Add the data to the data provider, which automatically pushes it to the widget 
    List<CModel> list = dataProvider.getList(); 
    for (CModel product : listCheckout) { 
     list.add(product); 
    } 

    column.setSortable(true); 

    // Add a ColumnSortEvent.ListHandler to connect sorting to the List 
    ListHandler<CModel> columnSortHandler = new ListHandler<CModel>(list); 
    columnSortHandler.setComparator(column, new Comparator<CModel>() { 
     public int compare(CModel p1, CModel p2) { 
      if (p1 == p2) { 
       return 0; 
      } 

      // Compare the columns. 
      if (p1 != null) { 
       if (valueToCompare.equals("code")) { 
        return (p2 != null) ? p1.getFproductid().compareTo(p2.getFproductid()) : 1; 
       } 

       else if (valueToCompare.equals("desc")) { 
        return (p2 != null) ? p1.getFproduct_name().compareTo(p2.getFproduct_name()) : 1; 
       } 

       else if (valueToCompare.equals("type")) { 
        return (p2 != null) ? 
          uec.computeTypeLabel(p1).compareTo(uec.computeTypeLabel(p2)) : 1; 
       } 

       else if (valueToCompare.equals("maxex")) { 
        return (p2 != null) ? uec.exQtyLabel(p1).compareTo(uec.exQtyLabel(p2)) : 1; 
       } 

       else if (valueToCompare.equals("unit")) { 
        return (p2 != null) ? p1.getFuom().compareTo(p2.getFuom()) : 1; 
       } 

       else if (valueToCompare.equals("status")) { 
        return (p2 != null) ? uec.qtyLabel(p1).compareTo(uec.qtyLabel(p2)) : 1; 
       } 

       else if (valueToCompare.equals("qty")) { 
        return (p2 != null) ? Double.compare(p1.getFqty(), p2.getFqty()) : 1; 
       } 

       else if (valueToCompare.equals("price")) { 
        return (p2 != null) ? uec.extPriceLabel(p1).compareTo(uec.extPriceLabel(p2)) : 1; 
       } 

       else if (valueToCompare.equals("total")) { 
        return (p2 != null) ? Double.compare(p1.getFtotal_line(), p2.getFtotal_line()) : 1; 
       } 
      } 
      return -1; 
     } 
    }); 

    dg.addColumnSortHandler(columnSortHandler); 
    dg.getColumnSortList().push(column); 
} 

каждый раз, я буду устанавливать данные для моего списка DataGrid,

dgCheckout.redraw(); 

    dgCheckout.setRowCount(lengthOfList, true); 
    dgCheckout.setRowData(0, newList); 

    sortColumn(newList);