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

dos*_*ant 4 java vaadin

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

建议的解决方案包括:

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

缺点:

  1. 这些项目未排序/过滤。
  2. Vaadin 8 的解决方案,Vaadin 13 中没有的方法。
  3. 提供的方法受保护,因此无法调用。

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

Kas*_*rer 5

由于您转换grid.getDataProvider为 a 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());
Run Code Online (Sandbox Code Playgroud)

编辑:你在回答中说这感觉“hacky”。我明白你的意思,但这就是这样做的方法。我认为这种行为可以作为网格本身的公共 api 提供:List<Type> list = grid.getCurrentItems();. 然后网格会在内部执行此操作,这样您自己就不会看到“hacky”部分。我确信当 dataprovider 不是 的实例时,他们知道如何执行相同的操作ListDataProvider。您可以在github 存储库中为此打开一个功能请求