Получить все элементы из таблицы с текущими фильтрами и сортировкой, примененными в Vaadin 13 - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь получить все элементы из сетки для экспорта. Полученный список должен соответствовать всем применяемым фильтрам и сортировке. Я использую 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. Указанный метод защищен , поэтому не может быть вызван.

Как на самом деле получить все элементы из сетки с применением фильтров и сортировки?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Поскольку вы преобразуете grid.getDataProvider в ListDataProvider<Type>, вы можете получить текущие фильтры из ListDataProvider, чтобы использовать их для запроса выборки.

Но только использование фильтра для запроса будет игнорировать порядок сортировки , Чтобы принять во внимание всю эту информацию, вам нужно использовать информацию как из 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());

Редактировать: в своем ответе вы говорите, что это кажется "хакерским". Я понимаю, что вы имеете в виду, но это способ сделать это. Я думаю, что это поведение может быть доступно как publi c api на самой сетке: List<Type> list = grid.getCurrentItems();. Сетка будет делать это внутренне, чтобы вы сами не увидели «хакерскую» часть. Я уверен, что они знают способы сделать то же самое, когда поставщик данных не является экземпляром ListDataProvider. Вы можете открыть запрос функции для этого в github repo

0 голосов
/ 13 февраля 2020

Одно решение, которое я нашел, работает для меня. Это не подчиняется фильтрации, а сортировке , что в настоящее время достаточно для моего случая. И это выглядит очень странно:

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()), чтобы получить диапазон для фактического query.
  2. Метод getFilter() для DataCommunicator равен protected и не может быть вызван для извлечения фильтра (поэтому здесь используется null (= без фильтра)).
...