Выберите элемент в CellList, используя SelectionModel или ListDataProvider
Я использовал CellList для распечатки моих данных, используя ListDataProvider для управления данными и SelectionModel для выбора элемента из CellList и генерации событий соответственно.
Теперь, когда я обновляю или удаляю элемент, используя cellList.getList(). Set(index, bean) или cellList.getList(). Remove(), он успешно выполняет операцию. Но после этого он автоматически выбирает первую запись в CellList, которую я не хочу.
Может кто-нибудь предложить, как я могу отменить выбор выбранной записи в CellList?
Ниже приведен код, как я инициализирую selectionmodel и listprovider:
ListDataProvider<AppsBean> dataProvider = new ListDataProvider<AppsBean>();
CellList<AppsBean> appsCellList;
SingleSelectionModel<AppsBean> singleSelectionModel;
ProvidesKey<AppsBean> keyProvider = new ProvidesKey<AppsBean>() {
public Object getKey(AppsBean item) {
// Always do a null check.
return (item == null) ? null : item.getId();
}
};
//here cell is the AbstractCell<AppsBean>
appsCellList = new CellList<AppsBean> (cell, keyProvider);
dataProvider.addDataDisplay(appsCellList);
appsCellList.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.BOUND_TO_SELECTION);
singleSelectionModel = new SingleSelectionModel<AppsBean>(keyProvider);
appsCellList.setSelectionModel(singleSelectionModel);
singleSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
AppsBean selectedApp = singleSelectionModel.getSelectedObject();
if (selectedApp != null)
appsForm.fillApps(selectedApp);
}
});
Когда я добавляю новую запись:
dataProvider.getList().add(0, appsBean);
Для обновления записи:
AppsBean bean = singleSelectionModel.getSelectedObject();
dataProvider.getList().set(dataProvider.getList().indexOf(bean), appsBean);
И для удаления:
int selectedIndex = dataProvider.getList().indexOf(singleSelectionModel.getSelectedObject());
dataProvider.getList().remove(selectedIndex);
3 ответа
Вам нужно будет реализовать KeyProvider, чтобы убедиться, что выбранный DTO остается неизменным даже при изменении самого объекта.
Если вы не предоставите KeyProvider, он, вероятно, будет использовать equals для сравнения объектов, и если они изменятся, вы можете столкнуться с проблемами.
ProvidesKey keyProvider = new ProvidesKey() {
public Object getKey(Contact item) {
//return the unique identifier for your DTO
return (item == null) ? null : item.id;
}
};
Затем вы должны инициализировать CellTable и selectionModel с этим keyProvider
CellList cellList = new CellList(new ContactCell(),keyProvider);
SelectionModel selectionModel = new SingleSelectionModel(keyProvider);
cellList.setSelectionModel(selectionModel);
Обновить Отмена выбора выбранного объекта работает следующим образом:
Object obj = selectionModel.getSelectedObject();
if (obj != null) {
selectionModel.setSelected(obj,false);
}
У меня была такая же проблема с GWT 2.5.1. Отмена выбора объекта программным способом не работала: следующая строка была выбрана, когда я удалил объект из списка поставщика данных (и отмена выбора вызвала другое нежелательное событие). Решение было сделать:
selectionModel.getSelectedSet().clear();
У меня была та же проблема: @vbjain wrote: Теперь, когда я обновляю или удаляю элемент, используя cellList.getList().set(index, bean)
или же cellList.getList().remove()
Успешно сделайте операцию. Но после этого он автоматически выбирает первую запись в CellList
чего я не хочу.
После нескольких часов поиска я обнаружил, что это происходит, когда политика клавиатуры:
KeyboardSelectionPolicy.BOUND_TO_SELECTION
Если вы выберете KeyboardSelectionPolicy.DISABLED
, вы не можете перечислить вверх / вниз по клавиатуре, но проблема с выбором первой строки решена.