Я просматривал документацию Vaadin о том, как добиться пользовательской фильтрации для поля со списком. В частности, многообещающим выглядел раздел «Фильтрация по строке».
Согласно документации Vaadin, мы реализовали специальный интерфейс для адаптации метода поиска ComboBox:
Код: Выделить всё
public interface CustomerDataFilter {
List fetch(int offset, int limit, String filterText);
int getCount(String filterText);
}
Затем мы создали метод согласно документации для заполнения 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);
});
}
Код: Выделить всё
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);
}
Код: Выделить всё
The number of items returned by the data provider exceeds the limit specified by the query (1).Может ли кто-нибудь подсказать/помочь нам, как реализовать пользовательскую фильтрацию для 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()));
}
Подробнее здесь: https://stackoverflow.com/questions/579 ... aadin-flow
Мобильная версия