Как фильтровать сетку Vaadin по умолчанию

Привет, я пытаюсь написать фильтр сетки в рамках Vaadin. Моя цель состоит в том, чтобы у пользователя было поле со списком с выпадающим списком, и он мог выбрать, что он хочет видеть только записи 3, 6, 9 недель назад. Я написал его, но у меня проблема, потому что он не работает как фильтр по умолчанию. Я имею в виду, что если я открываю страницу, сетка отображается без фильтра. Мне нужно сначала нажать на кнопку. Можно ли фильтровать сетку по умолчанию, показывая только записи за 3 недели? Как мне с этим справиться?

     final ComboBox<Integer> timePeriodSelector = new ComboBox<>("Time Filter", Arrays.asList(3, 6, 9);
    timePeriodSelector.setEmptySelectionAllowed(false);
    timePeriodSelector.setTextInputAllowed(false);
    timePeriodSelector.setValue(3);
    timePeriodSelector.addValueChangeListener(this::onWeekChange);

...

private void onWeekChange(HasValue.ValueChangeEvent<Integer> event) {

    switch (event.getValue()) {
    case 3:
        dateToCompare = LocalDate.now().minusDays(21);
        break;
    case 6:
        dateToCompare = LocalDate.now().minusDays(42);
        break;
    case 9:
        dateToCompare = LocalDate.now().minusDays(63);
        break;
    default:
        dateToCompare = LocalDate.now().plusDays(21);
    }

    ListDataProvider<CcEvent> dataProvider = (ListDataProvider<CcEvent>) eventsOverview.getDataProvider();
    dataProvider.setFilter(CcEvent::getReportingDate,
            date -> compareDates(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), dateToCompare));
}

private Boolean compareDates(LocalDate dateFromTable, LocalDate dateFromFilter) {
    return dateFromTable.isBefore(dateFromFilter);
}

person Anna K    schedule 07.09.2017    source источник
comment
Измените порядок ваших звонков. Вы должны вызвать сначала addValueChangeListener и сразу после этого setValue. Он должен запускать код прослушивателя и фильтровать ваш контейнер.   -  person Shirkam    schedule 13.09.2017


Ответы (1)


этот фрагмент кода выглядит красиво и именно так задуман фильтр Grid. Однако все, что вам нужно сделать, это поменять местами setValue вызов с addValueChangeListener вызовом.

Установка прослушивателя перед установкой значения гарантирует, что ValueChangedEvent сработает!

person Manuel Kollegger    schedule 07.09.2017
comment
Вы имеете в виду, что мне нужно изменить порядок методов, как здесь? timePeriodSelector.addValueChangeListener (это:: onWeekChange); timePeriodSelector.setValue (3); Это не работает :( - person Anna K; 07.09.2017
comment
Да, это то, что я думал, это все, что вам нужно было сделать. Я попробовал ваш код с addValueChangeListener( x -> Notification.show(x.toString()), и если setValue вызывается перед addValueChangeListener, уведомление не отображается. Однако, если он вызывается впоследствии, отображается уведомление. - person Manuel Kollegger; 07.09.2017
comment
Еще одна идея: поставщик данных для eventsOverview устанавливается путем вызова setItemsили чего-то подобного? Если к моменту вызова setValue поставщик данных еще не установлен, данных для фильтрации еще нет. - person Manuel Kollegger; 07.09.2017