CellTableにAsyncDataProviderを設定し、SimplePagerに追加しました。列に基づく並べ替えを処理するためにListHandlerを接続しました。その列のヘッダーをクリックしてもデータは変更されませんが、ページャー内の次/前のページに移動すると、データが並べ替えられます。また、列がクリックされる前に、列がソート可能であることを示す視覚的なインジケーターが列にありません。
列のヘッダーをクリックしたときにデータを更新するにはどうすればよいですか?
これが私のコードスニペットです
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ショーケースアプリにはこの機能があるようですが、どのように機能したかはそれほど明確ではありません。