我有一个GWT Celltable列,需要按字母顺序排序。我关注了official documentation和other 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());
}
}
答案 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);