Vaadin - добавление столбцов в сетку с карты
Я хочу отображать данные в сетке vaadin, но я хочу динамически создавать столбцы для каждого значения из списка customAttributes. Моя модель данных более или менее выглядит так
Item
name: String
localization: Localization
visible: Boolean
customAttributes: List<CustomAttribute>
CustomAttribute
name: String
value: String
Каждый объект имеет одинаковый набор типов атрибутов, различаются только значения. Пользователь может вручную определить новые типы атрибутов.
Как я могу создать эту сетку? В настоящее время я делаю это следующим образом:
grid.setColumns("name", "visible");
grid.addColumn(v -> v.getLocalization().getName()).setHeader("Localization");
Но я понятия не имею о динамическом создании столбцов для каждого настраиваемого атрибута.
1 ответ
Как уже было написано в комментариях, вы можете перебирать имена атрибутов, предполагая, что у вас есть их список (или набор). Одна небольшая проблема заключается в том, что вам нужно сделать это таким образом, чтобы значения внутри обратного вызова были фактически окончательными.
attributeNames.forEach(name -> {
grid.addColumn(item -> item.getCustomAttributes().get(name))
.setHeader(name);
});
Если вы не знаете имена атрибутов напрямую, но загружаете все элементы в память, а не лениво загружаете их, то вы можете найти уникальные имена, перебирая все элементы:
items.stream().flatMap(item -> item.getCustomAttributes().keySet().stream())
.distinct().forEach(<same loop as in the previous example>);