如何在Vaadin 8 Grid中重新应用过滤器

时间:2017-10-21 01:06:35

标签: vaadin vaadin8 vaadin-grid

我已经为我的网格添加了过滤器,如下所示:

filterTextField.addValueChangeListener(event -> {
        myListDataProvider.addFilter(
                columnName, 
                value-> value.toLowerCase().contain(filterTextField.getValue()));
    });

设置并应用过滤器。但是后来我在网格上执行一个动作,这需要重新加载项目,以便:

grid.setItems(reloadItemsDueToAction());

当我执行此操作时,filterTextField当然仍会填充并重新加载网格,但问题是我不知道如何重新应用{{1}中设置的过滤器1}}以便根据ListDataProvider再次过滤网格。仍应在ListDataProvider中设置过滤器,但如何在网格中应用它们?

1 个答案:

答案 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);

使用多个过滤器进行测试。