Hi,
When calling refreshAll() on a CheckboxGroup’s data provider after replacing all items, it seems to internally call updateCheckbox on old checkboxes that reference outdated data.
Is this the expected behavior, or could it be a bug?
Here’s a minimal example that reproduces the issue:
public class VaadinTestMainUI extends VerticalLayout {
public VaadinTestMainUI() {
Data data = new Data(new String[] {"1", "2", "3"});
ListDataProvider<Row> dataProvider = new ListDataProvider<>(data.getRows());
CheckboxGroup<Row> checkBoxGroup = new CheckboxGroup<>();
checkBoxGroup.setItemLabelGenerator(Row::getValue); // 2. java.lang.ArrayIndexOutOfBoundsException
checkBoxGroup.setDataProvider(dataProvider);
add(checkBoxGroup);
add(new Button("Click me", e -> {
data.setData(new String[] {"1", "2"});
dataProvider.getItems().clear();
dataProvider.getItems().addAll(data.getRows());
dataProvider.refreshAll(); // 1. java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
}));
}
private static class Row {
private int index;
private Data data;
public Row(Data data, int index) {
this.data = data;
this.index = index;
}
public String getValue() {
return data.getValue(index);
}
}
private static class Data {
private String[] data;
public Data(String[] data) {
this.data = data;
}
public void setData(String[] data) {
this.data = data;
}
public String getValue(int index) {
return data[index]; // 3. thrown from here
}
public List<Row> getRows() {
List<Row> rows = new ArrayList<>();
for (int i = 0; i < data.length; i++) {
rows.add(new Row(this, i));
}
return rows;
}
}
}
stacktrace:
java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
at **.VaadinTestMainUI$Data.getValue(VaadinTestMenuUI.java:56)
at **.VaadinTestMainUI$Row.getValue(VaadinTestMainUI.java:42)
at **.VaadinTestMainUI.lambda$2(VaadinTestMainUI.java)
at com.vaadin.flow.component.checkbox.CheckboxGroup.updateCheckbox(CheckboxGroup.java:875)
********
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at com.vaadin.flow.component.checkbox.CheckboxGroup.refreshCheckboxes(CheckboxGroup.java:852)
at com.vaadin.flow.component.checkbox.CheckboxGroup.setValue(CheckboxGroup.java:466)
at com.vaadin.flow.component.checkbox.CheckboxGroup.setValue(CheckboxGroup.java:114)
at com.vaadin.flow.component.HasValue.clear(HasValue.java:180)
at com.vaadin.flow.component.checkbox.CheckboxGroup$2.onDiscard(CheckboxGroup.java:379)
at com.vaadin.flow.component.shared.SelectionPreservationHandler.handleDataChange(SelectionPreservationHandler.java:87)
at com.vaadin.flow.component.checkbox.CheckboxGroup.handleDataChange(CheckboxGroup.java:394)
********
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at com.vaadin.flow.data.provider.AbstractDataProvider.fireEvent(AbstractDataProvider.java:132)
at com.vaadin.flow.data.provider.AbstractDataProvider.refreshAll(AbstractDataProvider.java:72)
*** button click **