使用GWT 2.6.1,UiBinder,DataGrid 还可以使用 SingleSelectionModel 来选择单行:
final SingleSelectionModel<User> selectionModel = new SingleSelectionModel<>(keyProvider);
复选框列:
// checkboxes
Column<User, Boolean> checkBoxColumn = new Column<User, Boolean>(
new CheckboxCell(false, false)) {
@Override
public Boolean getValue(User user) {
return user.isChecked();
}
};
checkBoxColumn.setFieldUpdater(new FieldUpdater<User, Boolean>() {
@Override
public void update(int index, User user, Boolean value) {
user.setChecked(value);
}
});
所以我将“已检查”用户状态存储为User实体类中的布尔字段,而不是 完全使用SelectionModel。
现在我需要实现自定义标题复选框以选择/取消选择列中的所有复选框。
public class CheckboxHeader extends Header<Boolean> {
public CheckboxHeader(CheckboxCell cell) {
super(cell);
}
@Override
public Boolean getValue() {
return null;
}
}
不知道如何正确实现此标头类以在DataGrid中添加列:
dataGrid.addColumn(checkBoxColumn, new CheckboxHeader(new CheckboxCell(false, false)));
另一个麻烦是启用/禁用所有这些复选框,方法是选中其他复选框 不在DataGrid中 如何从列/ selectionmodel / etc中检索所有复选框并逐个启用/禁用它们? 感谢任何建议。
答案 0 :(得分:1)
混合数据模型(用户实体)和用户界面状态(isSelected
)绝不是一个好主意。
这是你可以这样做的方法(用你的对象替换T,或者创建一个可以重复使用的列对象):
Column<T, Boolean> checkColumn = new Column<T, Boolean>(new CheckboxCell()) {
@Override
public Boolean getValue(T object) {
return getSelectionModel().isSelected(object);
}
};
checkColumn.setFieldUpdater(new FieldUpdater<T, Boolean>() {
@Override
public void update(int index, T object, Boolean value) {
getSelectionModel().setSelected(object, value);
dataProvider.refresh();
}
});
myDataGrid.setSelectionModel(getSelectionModel(), DefaultSelectionEventManager.<T> createCheckboxManager(0));
Header<Boolean> selectAllHeader = new Header<Boolean>(new HeaderCheckbox()) {
@Override
public Boolean getValue() {
for (T item : getVisibleItems()) {
if (!getSelectionModel().isSelected(item)) {
return false;
}
}
return getVisibleItems().size() > 0;
}
};
selectAllHeader.setUpdater(new ValueUpdater<Boolean>() {
@Override
public void update(Boolean value) {
for (T object : getVisibleItems()) {
getSelectionModel().setSelected(object, value);
}
}
});
myDataGrid.addColumn(checkColumn, selectAllHeader);