GWT 过滤表格后排序

问题描述 投票:0回答:2

我有一个简单的表格(CellTable)和一个用于过滤器的文本框。

我从后端获取的 CellTable 值。加载项目列表后,我可以放置一些过滤字符串以获得合适的结果。为了从数据提供者中过滤列表,我使用了谓词。过滤后,我将结果设置到 CellTable。

就像这里:

    void onFilterNameKeyUp(KeyUpEvent e) {
        List<CustomerDTO> filtered = this.dataProvider.getList();
        Predicate<CustomerDTO> filter = new Predicate<CustomerDTO>() {
            @Override
            public boolean apply(CustomerDTO input) {
                if (input.getName() == null) {
                    return false;
                } else {
                    return input.getName().toLowerCase()
                            .contains(filterName.getValue().toLowerCase());
                }
            }
        };

    filtered = Lists.newArrayList(Iterables.filter(this.dataProvider.getList(), filter));
    this.customerList.setRowCount(filtered.size(), true);
    this.customerList.setRowData(0, filtered);  
}

    this.dataProvider = new ListDataProvider<CustomerDTO>();
    dataProvider.addDataDisplay(this.customerList);
    final ListHandler<CustomerDTO> sortHandler = new ListHandler<CustomerDTO>(
            this.dataProvider.getList());
    this.customerList.addColumnSortHandler(sortHandler);
    this.customerList.getColumnSortList().push(this.rbKeyNameColumn);

一切正常,但我还有一个用于该表第一列的排序处理程序,当我想对列表进行排序时,我将对原始项目列表进行排序。

如何解决这个问题?这意味着我想排序并显示过滤后的列表,而不是来自数据提供者的原始列表。

gwt
2个回答
0
投票

我有一个表在从服务器接收到一些数据后更改内容。这是我的方法:

public void onSuccess(List<List<String>> result) {
                  List<Product> list = dataProvider.getList();
                  list.clear();
                  r_tableproducts.setRowCount(result.size());
                  for (List<String> l : result) {
                      list.add(new Product(l));
                  }
                  r_tableproducts.getColumnSortList().clear();
                  r_tableproducts.getColumnSortList().push(r_tableproducts.getColumn(1));
              ColumnSortEvent.fire(r_tableproducts,r_tableproducts.getColumnSortList());
              }

接收新数据后使用第二列对我的列表进行排序(覆盖所有旧数据)。

也许尝试一下这种方法?在新列表中过滤数据并修改 dataProvider 为您提供的列表,添加所有元素。

类似:

List<CustomerDTO> result = Lists.newArrayList(Iterables.filter(this.dataProvider.getList(), filter));
  this.customerList.setRowCount(result.size(), true);
  this.dataProvider.getList().clear();
  this.dataProvider.getList().addAll(result);


0
投票

您需要分离保存完整列表的 dataProvider 并提供一个单独的“过滤”数据提供程序来驱动 cellTable 的显示。下面示例中的cellTable 绑定到filteredDataProvider 以用于排序、显示目的。 下面的代码只是给出一个总体思路,因此语法上可能不准确。

void onFilterNameKeyUp(KeyUpEvent e) {
    List<CustomerDTO> filtered = this.dataProvider.getList();
    Predicate<CustomerDTO> filter = new Predicate<CustomerDTO>() {
        @Override
        public boolean apply(CustomerDTO input) {
            if (input.getName() == null) {
                return false;
            } else {
                return input.getName().toLowerCase()
                        .contains(filterName.getValue().toLowerCase());
            }
        }
    };

    filtered = Lists.newArrayList(Iterables.filter(this.dataProvider.getList(), filter));
    this.customerList.setRowCount(filtered.size(), true);
    this.filteredDataProvider.getList().clear();
    this.filteredDataProvider.getList().addAll(filtered); 
}

    this.dataProvider = new ListDataProvider<CustomerDTO>();
    // Code here to populate the dataProvider
    this.filteredDataProvider = new ListDataProvider<CustomerDTO>();
    // Creating separate DataProvider to hold the filtered set
    this.filteredDataProvider.getList().addAll(this.dataProvider.getList());
    filteredDataProvider.addDataDisplay(this.customerList);
    //        dataProvider.addDataDisplay(this.customerList);
    // Sort Handler uses filteredDataProvider instead of the dataProvider with full list
    final ListHandler<CustomerDTO> sortHandler = new ListHandler<CustomerDTO>(
            this.filteredDataProvider.getList());
    this.customerList.addColumnSortHandler(sortHandler);
    this.customerList.getColumnSortList().push(this.rbKeyNameColumn);
© www.soinside.com 2019 - 2024. All rights reserved.