1

我想在 ListHandler 的帮助下为 celltable 中的列添加排序。但它没有排序。我不明白为什么它不起作用。我的代码基于 GWT 教程。请给我一些建议。

合同.java

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

  //getters and setters...   
}

主.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

3 回答 3

4

嘿,我很久以前也面临同样的问题。然后我知道对象引用 id 与我添加到表中的不同。一旦我得到了原因,就很容易找到解决方案。也请ListHandler在添加列之前注册您的CellTable

请注意您的评论的编辑:

没有任何问题comparator。问题还是一样。与 CellTable 相比,它反映了比较器中的对象错误。

请尝试替换代码如下:

contractDataProvider.getList().addAll(result);    
ListHandler<Contract> columnSortHandler = new ListHandler<Contract>(contractDataProvider.getList());
于 2013-06-16T13:51:09.440 回答
0

尝试将您的 columnSortHandler 的创建移出 onSuccess 方法。创建列后立即放置它。目前,您在添加 columnSortHandler 之前添加结果。我认为这是错误的顺序。

于 2013-06-17T12:53:53.867 回答
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 );
于 2013-06-20T05:04:22.920 回答