从 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());

您正在制作两个数据副本:resultlistlist 连接到 dataProvider:

List<ContactInfo> list = dataProvider.getList();

并且 listListenerresult 相连:

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());