我已经为我的CellTable设置了一个AsyncDataProvider并将其添加到SimplePager。我已经连接了一个ListHandler来照顾基于列的排序。 当我单击该列的标题时,数据不会改变,但在进入分页器内的下一页/上一页时,数据将被排序。同样在点击列之前,列上没有可视指示符,表明它是可排序的。Gwt使用列排序处理程序的简单寻呼机问题
当我单击列的标题时,如何获取要更新的数据?
这里是我的代码片段
service.getHosts(environment, new AsyncCallback<Set<String>>() {
@Override
public void onSuccess(final Set<String> hosts) {
final List<String> hostList = new ArrayList<String>(hosts);
//Populate the table
CellTable<String> hostTable = new CellTable<String>();
TextColumn<String> hostNameColumn = new TextColumn<String>(){
@Override
public String getValue(String string){
return string;
}
};
NumberCell numberCell = new NumberCell();
Column<String, Number> lengthColumn = new Column<String, Number>(numberCell){
@Override
public Number getValue(String string) {
return new Integer(string.length());
}
};
AsyncDataProvider<String> dataProvider = new AsyncDataProvider<String>() {
@Override
protected void onRangeChanged(HasData<String> data) {
int start = data.getVisibleRange().getStart();
int end = start + data.getVisibleRange().getLength();
List<String> subList = hostList.subList(start, end);
updateRowData(start, subList);
}
};
// Hooking up sorting
ListHandler<String> columnSortHandler = new ListHandler<String>(hostList);
columnSortHandler.setComparator(lengthColumn, new Comparator<String>(){
@Override
public int compare(String arg0, String arg1) {
return new Integer(arg0.length()).compareTo(arg1.length());
}
});
hostTable.setPageSize(10);
hostTable.addColumnSortHandler(columnSortHandler);
hostTable.addColumn(hostNameColumn,"Host Name");
lengthColumn.setSortable(true);
hostTable.addColumn(lengthColumn, "Length");
VerticalPanel verticalPanel = new VerticalPanel();
SimplePager pager = new SimplePager();
pager.setDisplay(hostTable);
dataProvider.addDataDisplay(hostTable);
dataProvider.updateRowCount(hosts.size(), true);
verticalPanel.add(hostTable);
verticalPanel.add(pager);
RootPanel.get().add(verticalPanel);
}
@Override
public void onFailure(Throwable throwable) {
Window.alert(throwable.getMessage());
}
});
我不知道如何确保该列表由表和传呼机都共享。将寻呼机之前,我用
ListDataProvider<String> dataProvider = new ListDataProvider<String>();
ListHandler<String> columnSortHandler = new ListHandler<String>(dataProvider.getList());
的AsyncDataProvider没有方法getList
。
总结我希望数据在列单击后立即排序,而不是在使用分页器控件向前/向后移动后排序。
按照该建议,我已经改变了AsyncDataProvider代码
AsyncDataProvider<String> dataProvider = new AsyncDataProvider<String>() {
@Override
protected void onRangeChanged(HasData<String> data) {
int start = data.getVisibleRange().getStart();
int end = start + data.getVisibleRange().getLength();
List<String> subList = hostList.subList(start, end);
// Hooking up sorting
ListHandler<String> columnSortHandler = new ListHandler<String>(hostList);
hostTable.addColumnSortHandler(columnSortHandler);
columnSortHandler.setComparator(lengthColumn, new Comparator<String>(){
@Override
public int compare(String v0, String v1) {
return new Integer(v0.length).compareTo(v1.length);
}
});
updateRowData(start, subList);
}
};
但在即使该行为没有任何变化。有人可以请解释过程。 GWT展示应用程序似乎具有此功能,但他们如何做到这一点并不清楚。
有趣的是,我的排序问题是由于双重打算使用onRangedChanged而不是重写AsynchHandler。onColumnSort,那么你需要的一切都来自事件,你避免发射setVisibleRangeAndClearData ...我会稍后更新代码 – Clanomadd 2013-03-30 05:51:09
感谢您的解释。 – nikhil 2013-03-31 12:27:10
没问题,我只是更新了代码以反映onColumnSort事件处理。 – Clanomadd 2013-04-01 14:05:58