Я только что закончил реализацию этого на основе информации из нескольких источников. Вот то, что я придумал, и это сработало для меня.
Все ячейки в виджете ячеек должны быть переопределены, чтобы возвращать true для handlesSelection (), например:
/**
* This text cell is designed for use in cell widgets that are tied to Places
* and thus need to have the Activity/Presenter manage the selection to allow
* for a mayStop() rejection of the navigation (user clicks cancel at prompt).
*/
public class PlaceTextCell extends TextCell
{
@Override
public boolean handlesSelection()
{
// So that the selection model won't change the selection automatically.
return true;
}
}
Затем вы должны обработать событие выбора через CellPreviewEvent (которое происходит до того, как происходит выбор, в отличие от SelectionChangeEvent). Я использовал DataGrid, но это также должно работать на CellTable.
selectionDataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<Dto>() {
@Override
public void onCellPreview(CellPreviewEvent<Dto> event) {
if(Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK ||
event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)
{
eventBus.fireEvent(new MySelectionChangeRequestEvent(event.getValue()));
}
}
});
Это запускает событие запроса на изменение места, которое вызывает PlaceController (). GoTo (). Это инициирует проверку mayStop () в Activity. Тогда ваша активность должна справиться с этим взаимодействием.
В моем случае у меня есть одиночный ведущий. Так что я рассказываю ведущему о новом месте. Этот вызов обновляет представление для выбора соответствующей строки.
Кроме того, у меня все еще правильно работает selectionModel:
selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) {
eventBus.fireEvent(new MySelectionChangeEvent(selectionModel.getSelectedObject()));
}
});
Таким образом, после выбора этой новой строки запускается другое событие для обновления другой части пользовательского интерфейса на основе нового выбора.
- «Не выбирать, когда пользователь нажимает» обрабатывается
пользовательское переопределение ячейки.
- Часть "эффект изменения места" обрабатывается CellPreviewHandler и PlaceController.goTo (Place).
- Все остальное обрабатывается реализацией ваших действий и мест.