Maybe this can give you an idea.
Each div you are going to include corresponds to a specific item, and each one will have its own listener.
VirtualList<String> list = new VirtualList<>();
list.setItems("item1","item2", "item3","item4");
list.setRenderer(renderer());
super.add(list);
public static ComponentRenderer<Div, String> renderer() {
final SerializableBiConsumer<Div, String> items = (div, item) -> {
div.addClickListener(event -> {
Notification.show("Hello " + item);
});
div.add(new Span("Hello " + item));
};
return new ComponentRenderer<>(Div::new, items);
}
And using details maybe
public static ComponentRenderer<Div, String> renderer() {
final SerializableBiConsumer<Div, String> items = (div, item) -> {
div.addClickListener(event -> {
Notification.show("Hello " + item);
});
final Details details = new Details();
details.add(new Span("Hello: " + item));
div.add(details);
};
return new ComponentRenderer<>(Div::new, items);
}

