从网格中获取所有项目,并在 Vaadin 13 中应用当前过滤器和排序

Get all items from a Grid with current filters and sorting applied in Vaadin 13

我正在尝试导出网格中的所有项目。检索到的列表应服从所有应用的过滤器和排序。如果重要的话,我正在使用 ListDataProvider

建议的解决方案包括:

  1. 使用 ListDataProvider.getItems()grid.getDataProvider().fetch(new Query<>()).collect(Collectors.toList()) ()
  2. 使用 grid.getDataCommunicator().fetchItemsWithRange(0,grid.getDataCommunicator().getDataProviderSize())
  3. 使用 grid.getDataCommunicator().fetchFromProvider(..) (here)

缺点:

  1. 项目不是 sorted/filtered。
  2. Vaadin 8 的解决方案,方法在 Vaadin 13 中不存在。
  3. 提供的方法受保护,因此无法调用。

如何使用应用过滤器和排序从网格中实际获取所有项目?

我找到了一个适合我的解决方案。 这不服从过滤,而是服从排序,目前这对我的情况来说已经足够了。这看起来很老套:

ListDataProvider<Type> dataProvider = (ListDataProvider<Type>) grid.getDataProvider();
int size = dataProvider.getItems().size();
DataCommunicator<Type> dataCommunicator = grid.getDataCommunicator();
Stream<Type> stream =
    dataProvider.fetch(
        new Query<Type, SerializablePredicate<Type>>(
            0,
            size,
            dataCommunicator.getBackEndSorting(),
            dataCommunicator.getInMemorySorting(),
            null));
List<Type> list = stream.collect(Collectors.toList());

我在这里看到的主要问题是

  1. 必须在 (getItems().size()) 之前提取所有项目以获得实际查询的范围。
  2. DataCommunicatorgetFilter()方法是protected,不能调用获取过滤器(因此这里使用null(=无过滤器))。

由于您将 grid.getDataProvider 转换为 ListDataProvider<Type>,您可以从 ListDataProvider 获取当前过滤器以用于提取查询。

但是只对查询使用Filter会忽略排序顺序。要考虑所有这些信息,您需要使用来自 dataProvider(过滤信息)和 dataCommunicator(排序信息)的信息

ListDataProvider<Type> dataProvider = (ListDataProvider<Type>) grid.getDataProvider();
int totalSize = dataProvider.getItems().size();
DataCommunicator<Type> dataCommunicator = grid.getDataCommunicator();
Stream<Type> stream = dataProvider.fetch(new Query<>(
        0,
        totalSize,
        dataCommunicator.getBackEndSorting(),
        dataCommunicator.getInMemorySorting(),
        dataProvider.getFilter()));
List<Type> list = stream.collect(Collectors.toList());

编辑:你在回答中说这感觉 "hacky"。我明白你的意思,但这是做到这一点的方法。我认为这种行为可以作为网格本身的 public api 提供:List<Type> list = grid.getCurrentItems();。然后网格将在内部执行此操作,因此您自己不会看到 "hacky" 部分。我敢肯定,当数据提供者不是 ListDataProvider 的实例时,他们知道如何做同样的事情。您可以在 github repo

中为此打开功能请求