GWT - CellTable可排序列不会响应点击次数

时间:2018-05-30 23:52:06

标签: java sorting gwt uibinder celltable

我有一个GWT Celltable列,需要按字母顺序排序。我关注了official documentationother questions posted here,但我无法让它发挥作用。

我希望列对升序和降序进行排序。目前,克拉符号显示在列标题旁边,但单击时没有任何反应。浏览器控制台中也没有抛出任何错误。

我做错了什么?我混淆了代码 -

public class MyClass extends Composite {
    //other fields
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
    @UiField CellTable<MyObject> myTable = new CellTable<MyObject>();
    final ListDataProvider<MyObject> myDataProvider = new ListDataProvider<MyObject>();

    @UiConstructor
    public MyClass(...) {
        initWidget(uiBinder.createAndBindUi(this));
        // other initialization
        buildMyTable();
    }

    buildMyTable() {
        myDataProvider.addDataDisplay(myTable);

        Column<MyObject, String> colA = new Column<MyObject, String>(new TextCell()) {

            @Override
            public String getValue(MyObject object) {
                return object.getName();
            }
        };

        Column<MyObject, String> colB = new Column<MyObject, String>(new TextCell()) {

            @Override
            public String getValue(MyObject object) {
                return object.getAddress();
            }
        };

        // created other columns

        colA.setSortable(true);

        myTable.addColumn(colA, "COL A");
        myTable.addColumn(colB, "COL B");
        // added other columns to the table

        ListHandler<MyObject> columnSortHandler = new ListHandler<>(myDataProvider.getList());
        columnSortHandler.setComparator(colA, new Comparator<MyObject>() {

            @Override
            public int compare(MyObject o1, MyObject o2) {
                if (o1 == o2) {
                    return 0;
                }

                if (o1 != null) {
                    return (o2 != null) ? o1.getName.compareTo(o2.getName) : 1;
                }
                return -1;
            }
        });

        myTable.addColumnSortHandler(columnSortHandler);
        myTable.getColumnSortList().push(colA);
        ColumnSortEvent.fire(myTable, myTable.getColumnSortList());
    }
}

1 个答案:

答案 0 :(得分:3)

关于如何向CellTable添加数据的全部内容。例如,您可以

myDataProvider.setList(rowData);

myTable.setRowData(rowData);

但上述两种方法都不允许对数据进行排序。这是因为,您已经使用空列表定义了ListHandler。并且它不会注意到列表已经改变,因此不会执行排序。

请参阅ListDataProvider documentation

  

getList()返回的列表的修改(插入,删除,设置等)将反映在模型中。但是,列表中包含的项目的突变不会反映在模型中。您必须调用List.set(int,Object)来更新列表中的项目并将更改推送到显示,或调用refresh()将所有行推送到显示。 List.set(int,Object)执行得更好,因为它允许数据提供程序仅推送已更改的那些行,并且通常允许显示只重新呈现行的子集。

所以,你应该先getList()并改变它:

myDataProvider.getList().clear();
myDataProvider.getList().addAll(rowData);