我已经为我的网格添加了过滤器,如下所示:
filterTextField.addValueChangeListener(event -> {
myListDataProvider.addFilter(
columnName,
value-> value.toLowerCase().contain(filterTextField.getValue()));
});
设置并应用过滤器。但是后来我在网格上执行一个动作,这需要重新加载项目,以便:
grid.setItems(reloadItemsDueToAction());
当我执行此操作时,filterTextField
当然仍会填充并重新加载网格,但问题是我不知道如何重新应用{{1}中设置的过滤器1}}以便根据ListDataProvider
再次过滤网格。仍应在ListDataProvider中设置过滤器,但如何在网格中应用它们?
答案 0 :(得分:1)
在我看来,目前(8.1.5)只能通过再次设置DataProvider和过滤器来实现,例如:
private ListDataProvider<Entity> ldp
= new ListDataProvider<>(getGridItems()); // initial grid data
// then somewhere update grid & re-apply filters
SerializablePredicate<Entity> filter = ldp.getFilter(); // store filter
ldp = new ListDataProvider<>( getGridItems() ); // new ldp with fresh data
grid.setDataProvider(ldp); // instead of setItems()
if(filter!=null) ldp.addFilter(filter); // re-apply stored filter
同样的方式也适用于Table/Container
。
如果您使用setItems()
我猜Grid
已不再使用之前的DataProvider
,并且设置过滤器与之前的DataProvider
不会传播到Grid
。我不知道它是否明智但如果你真的需要使用setItems()
那么可能是这样的:
ListDataProvider<Entity> ldp = ((ListDataProvider<Entity>)g.getDataProvider());
SerializablePredicate<Entity> filter = ldp.getFilter();
grid.setItems(getGridItems());
ldp = ((ListDataProvider<Entity>)g.getDataProvider());
if(filter!=null) ldp.addFilter(filter);
使用多个过滤器进行测试。