Как добавить фильтры сетки в Vaadin 8?
Ваадин 8 только что вышел. добавление фильтров в сетку никогда не было в их документации, я нашел только одно рабочее решение здесь в stackoverflow.
HeaderCell cell = filterRow.getCell(pid);
// Have an input field to use for filter
TextField filterField = new TextField();
filterField.setColumns(0);
filterField.setHeight("23");
// Update filter When the filter input is changed
filterField.addTextChangeListener(change -> {
// Can't modify filters so need to replace
b.removeContainerFilters(pid);
// (Re)create the filter if necessary
if (! change.getText().isEmpty())
b.addContainerFilter(
new SimpleStringFilter(pid,
change.getText(), true, false));
});
cell.setComponent(filterField);
но теперь, после обновления, это решение больше не работает, так как SimpleStringFilter больше не доступен в новой сетке, а BeanItemContainer больше не распознаются и только позволяет setItems() заполнять данные сетки.
может ли кто-нибудь помочь мне обновить этот код для Vaadin 8?
2 ответов
можно добавить фильтрацию для сетки Vaadin 8.
предположим, что мы определили человек модель:
final class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
наши решетки реализация будет выглядеть так:
final class PersonGrid extends Grid<Person> {
public PersonGrid() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("foo"));
persons.add(new Person("bar"));
persons.add(new Person("foobar"));
addColumn(Person::getName).setCaption("Name");
setItems(persons);
}
}
Теперь мы можем создать макет с TextField это будет наш фильтр:
final class FilteredGridLayout extends VerticalLayout {
private final PersonGrid personGrid;
private final TextField nameFilter;
public FilteredGridLayout() {
nameFilter = new TextField();
nameFilter.setPlaceholder("Name...");
nameFilter.addValueChangeListener(this::onNameFilterTextChange);
addComponent(nameFilter);
personGrid = new PersonGrid();
addComponentsAndExpand(personGrid);
}
private void onNameFilterTextChange(HasValue.ValueChangeEvent<String> event) {
ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) personGrid.getDataProvider();
dataProvider.setFilter(Person::getName, s -> caseInsensitiveContains(s, event.getValue()));
}
private Boolean caseInsensitiveContains(String where, String what) {
return where.toLowerCase().contains(what.toLowerCase());
}
}
для пустого входного результата:фу, бар и foobar.
на фу результат: фу и фубар.
на бар результат: бар и Fooбар.
на foobar результат: foobar.
есть Vaadin grid addon, который будет портирован на Vaadin 8 позже, поэтому, если у вас есть время ждать его, вы можете получить строку фильтра в красивом пакете.
https://vaadin.com/directory#!аддон / gridutil
пожалуйста, прочитайте здесь оценку усилий от автора GridUtil.
https://github.com/melistik/vaadin-grid-util/issues/37#issuecomment-282756130