从 gwt rpc 填充的排序单元格 table 列不起作用
Sorting cell table columns populated from gwt rpc not working
我在尝试对单元格 table 中的特定列进行排序时遇到问题,该单元格是使用 RPC 从数据库中填充的。基本上我试图按字母顺序对姓氏列进行排序,但它不起作用。 Table 已完全填充,但排序不起作用。
知道为什么吗?
提前致谢
// Create the family name column.
final TextColumn<ContactInfo> familyNameColumn = new TextColumn<ContactInfo>() {
@Override
public String getValue(ContactInfo object) {
return object.getFamilyName();
}
};
table.setColumnWidth(familyNameColumn, 20, Unit.PCT);
// Make the family name sortable
familyNameColumn.setSortable(true);
// Add the columns
table.addColumn(familyNameColumn, UserMenuConstants.FAMILY_NAME_COLUMN);
table.addColumn(familyAdministratorColumn, UserMenuConstants.FAMILY_ADMINISTRATOR_COLUMN);
table.addColumn(apartmentNuberColumn, UserMenuConstants.FAMILY_APARTMENT_NUMBER_COLUMN);
table.addColumn(emailColumn, UserMenuConstants.EMAIL_ADDRESS_COLUMN);
table.addColumn(phoneNumberColumn, UserMenuConstants.PHONE_NUMBER_COLUMN);
DBGetContactInfoAsync rpcService = (DBGetContactInfoAsync) GWT.create(DBGetContactInfo.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBGetContactInfoImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.getContacts(new AsyncCallback<List<ContactInfo>>() {
@Override
public void onSuccess(List<ContactInfo> result) {
table.setRowCount(result.size());
ListDataProvider<ContactInfo> dataProvider = new ListDataProvider<ContactInfo>();
dataProvider.addDataDisplay(table);
List<ContactInfo> list = dataProvider.getList();
for (ContactInfo contactInfo : result) {
list.add(contactInfo);
}
ListHandler<ContactInfo> listHandler = new ListHandler<ContactInfo>(result);
listHandler.setComparator(familyNameColumn, new Comparator<ContactInfo>() {
@Override
public int compare(ContactInfo o1, ContactInfo o2) {
return o1.getFamilyName().compareTo(o2.getFamilyName());
}
});
table.addColumnSortHandler(listHandler);
}
@Override
public void onFailure(Throwable caught) {
...
}
});
将 onSuccess 方法中的大部分代码移出那里 - 没有理由在每次加载数据时都调用它。例如,您 can/should 只设置了一次比较器,等等
告诉你的 table 要使用哪一列进行排序:
table.getColumnSortList().push(familyNameColumn);
当您完成加载新数据后,告诉您的 table 对其进行排序:
ColumnSortEvent.fire(table, table.getColumnSortList());
您正在制作两个数据副本:result
和 list
。 list
连接到 dataProvider
:
List<ContactInfo> list = dataProvider.getList();
并且 listListener
与 result
相连:
ListHandler<ContactInfo> listHandler = new ListHandler<ContactInfo>(result);
所以你显示的是 list
但排序的是 result
.
直接替换
new ListHandler<ContactInfo>(result);
和
new ListHandler<ContactInfo>(list);
而且有效。
编辑:
您可以更轻松地将 result
传递给 ListDataProvider
构造函数:
new ListDataProvider<ContactInfo>(result);
然后,您不需要将值复制到 list
,只需执行
new ListHandler<ContactInfo>(dataProvider.getList());
我在尝试对单元格 table 中的特定列进行排序时遇到问题,该单元格是使用 RPC 从数据库中填充的。基本上我试图按字母顺序对姓氏列进行排序,但它不起作用。 Table 已完全填充,但排序不起作用。
知道为什么吗?
提前致谢
// Create the family name column.
final TextColumn<ContactInfo> familyNameColumn = new TextColumn<ContactInfo>() {
@Override
public String getValue(ContactInfo object) {
return object.getFamilyName();
}
};
table.setColumnWidth(familyNameColumn, 20, Unit.PCT);
// Make the family name sortable
familyNameColumn.setSortable(true);
// Add the columns
table.addColumn(familyNameColumn, UserMenuConstants.FAMILY_NAME_COLUMN);
table.addColumn(familyAdministratorColumn, UserMenuConstants.FAMILY_ADMINISTRATOR_COLUMN);
table.addColumn(apartmentNuberColumn, UserMenuConstants.FAMILY_APARTMENT_NUMBER_COLUMN);
table.addColumn(emailColumn, UserMenuConstants.EMAIL_ADDRESS_COLUMN);
table.addColumn(phoneNumberColumn, UserMenuConstants.PHONE_NUMBER_COLUMN);
DBGetContactInfoAsync rpcService = (DBGetContactInfoAsync) GWT.create(DBGetContactInfo.class);
ServiceDefTarget target = (ServiceDefTarget) rpcService;
String moduleRelativeURL = GWT.getModuleBaseURL() + "DBGetContactInfoImpl";
target.setServiceEntryPoint(moduleRelativeURL);
rpcService.getContacts(new AsyncCallback<List<ContactInfo>>() {
@Override
public void onSuccess(List<ContactInfo> result) {
table.setRowCount(result.size());
ListDataProvider<ContactInfo> dataProvider = new ListDataProvider<ContactInfo>();
dataProvider.addDataDisplay(table);
List<ContactInfo> list = dataProvider.getList();
for (ContactInfo contactInfo : result) {
list.add(contactInfo);
}
ListHandler<ContactInfo> listHandler = new ListHandler<ContactInfo>(result);
listHandler.setComparator(familyNameColumn, new Comparator<ContactInfo>() {
@Override
public int compare(ContactInfo o1, ContactInfo o2) {
return o1.getFamilyName().compareTo(o2.getFamilyName());
}
});
table.addColumnSortHandler(listHandler);
}
@Override
public void onFailure(Throwable caught) {
...
}
});
将 onSuccess 方法中的大部分代码移出那里 - 没有理由在每次加载数据时都调用它。例如,您 can/should 只设置了一次比较器,等等
告诉你的 table 要使用哪一列进行排序:
table.getColumnSortList().push(familyNameColumn);
当您完成加载新数据后,告诉您的 table 对其进行排序:
ColumnSortEvent.fire(table, table.getColumnSortList());
您正在制作两个数据副本:result
和 list
。 list
连接到 dataProvider
:
List<ContactInfo> list = dataProvider.getList();
并且 listListener
与 result
相连:
ListHandler<ContactInfo> listHandler = new ListHandler<ContactInfo>(result);
所以你显示的是 list
但排序的是 result
.
直接替换
new ListHandler<ContactInfo>(result);
和
new ListHandler<ContactInfo>(list);
而且有效。
编辑:
您可以更轻松地将 result
传递给 ListDataProvider
构造函数:
new ListDataProvider<ContactInfo>(result);
然后,您不需要将值复制到 list
,只需执行
new ListHandler<ContactInfo>(dataProvider.getList());