Как использовать пользовательскую фильтрацию со списком с поставщиком данных в Vaadin Flow?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как использовать пользовательскую фильтрацию со списком с поставщиком данных в Vaadin Flow?

Сообщение Anonymous »

В настоящее время мы используем Vaadin Flow версии 12.0.7 (мы не можем обновить ее по ряду причин) и хотим переопределить механизмы фильтрации для компонента ComboBox. Я имею в виду, что мы хотели бы изменить способ поиска элементов за ComboBox, когда пользователь вводит данные внутри ComboBox.

Я просматривал документацию Vaadin о том, как добиться пользовательской фильтрации для поля со списком. В частности, многообещающим выглядел раздел «Фильтрация по строке».

Согласно документации Vaadin, мы реализовали специальный интерфейс для адаптации метода поиска ComboBox:

Код: Выделить всё

public interface CustomerDataFilter {
List fetch(int offset, int limit, String filterText);
int getCount(String filterText);
}
Это довольно просто и соответствует примеру из документации почти 1:1.

Затем мы создали метод согласно документации для заполнения ComboBox данными. Также почти использовано 1:1 из документации:

Код: Выделить всё

private DataProvider
createDepartmentDataProvider(CustomerDataFilter service)
{
return DataProvider.fromFilteringCallbacks(query -> {
// getFilter returns Optional
String filter = query.getFilter().orElse(null);
return service.fetch(query.getOffset(),
query.getLimit(), filter).stream();
}, query -> {
String filter = query.getFilter().orElse(null);
return service.getCount(filter);
});
}
Мы вызываем указанный выше метод при инициализации данных для нашего ComboBox. На этом этапе мы также реализуем интерфейс (хотя это может быть некрасиво). Однако мы не совсем уверены, как использовать оба метода интерфейса. Нашей первой целью было просто всегда возвращать все элементы и игнорировать любую конкретную фильтрацию, поэтому мы всегда возвращаем весь отсортированный список. Это было сделано только в целях проверки, чтобы проверить, изменили ли мы фильтрацию.

Код: Выделить всё

public void updateCustomerList() {
List sorted = CustomerService.getInstance().findAll();
//for initial sorting
sorted.sort(new CustomerComperator());

DataProvider test = createDepartmentDataProvider(new CustomerDataFilter() {

@Override
public int getCount(String filterText) {
return 0;
}

@Override
public List fetch(int offset, int limit, String filterText) {
return sorted;
}
});

customerCompany.setItems(sorted);
customerCompany.setDataProvider(test);
}
Мы пытались увеличить значение getCount до 1, но как только мы устанавливаем его выше 0, возникают следующие исключения происходит:

Код: Выделить всё

The number of items returned by the data provider exceeds the limit specified by the query (1).
Мы предполагаем, что нам нужно каким-то образом настроить методы getCount и fetch таким образом, чтобы они реализовывали наш пользовательский поиск. Это не будет проблемой, поскольку у нас есть данные за ComboBox и filterText. Однако мы немного озадачены, зачем нам нужен метод getCount и как мы можем обойти показанное исключение? Наша идея заключалась в том, чтобы позволить getCount всегда возвращать значение 10, а при fetch возвращать подмножество нашего отсортированного списка относительно filterText.

Может ли кто-нибудь подсказать/помочь нам, как реализовать пользовательскую фильтрацию для ComboBox, или указать нам правильный путь?



Благодаря ответу Штеффена Харбиха мы нашли способ получить фильтрованный поставщик данных. По сути, это все, что нужно:

Код: Выделить всё

public void updateCustomerList() {
List sorted = CustomerService.getInstance().findAll();
sorted.sort(new CustomerComperator());
customerCompany.setItems(sorted);

ListDataProvider listTest = new ListDataProvider(sorted);
customerCompany.setDataProvider(listTest.filteringByPrefix(new CustomerProvider()));
}
CustomerProvider реализует только соответствующий интерфейс DataProvider. После этого мы можем просто применить метод filteringByPrefix, чтобы изменить поведение фильтрации.

Подробнее здесь: https://stackoverflow.com/questions/579 ... aadin-flow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»