У меня есть представление с одиночной сеткой выбора, в котором есть настраиваемый рендеринг деталей элемента. View имеет аннотацию @UIScope.
Возникла проблема с открытием / закрытием деталей. Чтобы воспроизвести его, вы должны покинуть представление, а затем вернуться к нему (как бы то ни было. Перемещение с помощью кнопки возврата в браузере или с помощью маршрутизатора vaadin).
Первый случай, когда setDetailsVisibleOnClick (true), вы можете открыть или закрыть детали. Например, когда я в первый раз возвращаюсь назад, открывались подробности. Затем я повторяю переход от и до просмотра, и на этот раз детали были закрыты.
Второй случай, когда я установил setDetailsVisibleOnClick (false) и реализовал прослушиватель кликов с setDetailsVisible для элемента. Также я устанавливаю переменную selectedItem add, затем select (selectedItem) и setDetailsVisible (selectedItem, true) в методе onAttach. Теперь, когда я возвращаюсь к просмотру, элемент выбран и подробности открываются. Однако, когда я выбираю другой элемент, детали запоминаемого элемента остаются открытыми. Собственно, это верно и для первого случая с setDetailsVisibleOnClick (true). Если вы вернетесь к просмотру и подробности откроются, они останутся открытыми после того, как вы нажмете на другой элемент сетки.
@Override
public void onAttach(AttachEvent event) {
//https://github.com/vaadin/vaadin-grid/issues/1850
setDetailsVisibleOnClick(true);
setDetailsVisibleOnClick(false);
if (selectedItem != null) {
select(selectedItem);
if (detailsRenderer != null) setDetailsVisible(selectedItem, true);
scrollToIndex(dataProvider.getItems().indexOf(selectedItem));
}
}
и SingleSelectionListener
event -> {
var item = event.getSelectedItem().orElse(null);
if (detailsRenderer != null) {
var oldVal = event.getOldValue();
if (selectedItem != null) setDetailsVisible(selectedItem, false);
if (oldVal != null) setDetailsVisible(oldVal, false);
if (item != null) setDetailsVisible(item, true);
getElement().executeJs("this.notifyResize()");//preserve rows heights on grid container resize
}
selectedItem = event.getSelectedItem().orElse(null);
}