1

ListHandler を使用して celltable の列の並べ替えを追加したいと考えています。しかし、それはソートされません。うまくいかない理由がわかりません。私のコードは GWT チュートリアルに基づいています。何か提案してください。

契約.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

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

私の場合、次のように並べ替えを行いました。

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 に答える