Я смог достичь этого с помощью default checkbox selection event manager.
По умолчанию у вас будет CheckboxCell
, который будет обрабатывать выбор строки. Хитрость заключается в том, что вы можете переопределить метод render()
CheckboxCell
и не показывать этот флажок, если соответствующая строка не разрешена для выбора, просто не вызывая метод super.render()
.
Ниже приведен полный рабочий код для вашего примера. Вы не можете выбирать строки, которые неактивны. Пожалуйста, обратите внимание на параметры конструктора new CheckboxCell(true, false)
- это важно.
public Widget test() {
DataGrid<DatagridType> grid = new DataGrid<DatagridType>();
final MultiSelectionModel<DatagridType> selectionModel = new MultiSelectionModel<DatagridType>(new ProvidesKey<DatagridType>() {
@Override
public Integer getKey(DatagridType item) {
return item.getRowId();
}
});
grid.setSelectionModel(selectionModel, DefaultSelectionEventManager.<DatagridType> createCheckboxManager());
selectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
Window.alert(selectionModel.getSelectedSet().toString());
}
});
grid.addColumn(new Column<DatagridType, Boolean>(new CheckboxCell(true, false)) {
@Override
public Boolean getValue(DatagridType object) {
return selectionModel.isSelected(object);
}
@Override
public void render(Context context, DatagridType object, SafeHtmlBuilder sb) {
if(object.isActive())
super.render(context, object, sb);
}
}, "Select");
TextColumn<DatagridType> nameColumn = new TextColumn<DatagridType>() {
@Override
public String getValue(DatagridType object) {
return object.getEmpName();
}
};
TextColumn<DatagridType> idColumn = new TextColumn<DatagridType>() {
@Override
public String getValue(DatagridType object) {
return Integer.toString(object.getEmpId());
}
};
TextColumn<DatagridType> statusColumn = new TextColumn<DatagridType>() {
@Override
public String getValue(DatagridType object) {
return object.isActive() ? "Active" : "In Acticve";
}
};
grid.addColumn(nameColumn, "EMP Name");
grid.addColumn(idColumn, "EMP ID");
grid.addColumn(statusColumn, "Status");
List<DatagridType> values = new ArrayList<DatagridType>();
values.add(new DatagridType(0, "ABC", 1001, true));
values.add(new DatagridType(1, "ABC", 1001, false));
values.add(new DatagridType(2, "AAA", 1002, true));
values.add(new DatagridType(3, "AAA", 1002, false));
values.add(new DatagridType(4, "BBB", 1003, true));
values.add(new DatagridType(5, "BBB", 1003, false));
grid.setRowData(values);
grid.setHeight("500px");
Window.alert("Done");
return grid;
}
private class DatagridType {
private int rowId;
private String empName;
private int empId;
private boolean active;
public DatagridType(int rowId, String empName, int empId, boolean active) {
this.rowId = rowId;
this.empName = empName;
this.empId = empId;
this.active = active;
}
public int getRowId() {
return rowId;
}
public String getEmpName() {
return empName;
}
public int getEmpId() {
return empId;
}
public boolean isActive() {
return active;
}
@Override
public String toString() {
return Integer.toString(rowId);
}
}
Мне просто нужно было добавить уникальный идентификатор строки в качестве идентификатора выбора.
После каждого изменения выбора вы увидите предупреждение со списком выбранных идентификаторов строк.