我有一个简单的表格(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);
一切正常,但我还有一个用于该表第一列的排序处理程序,当我想对列表进行排序时,我将对原始项目列表进行排序。
如何解决这个问题?这意味着我想排序并显示过滤后的列表,而不是来自数据提供者的原始列表。
我有一个表在从服务器接收到一些数据后更改内容。这是我的方法:
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);
您需要分离保存完整列表的 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);