GWT - Неожиданное срабатывание CellCist SelectionChangeEvent
У меня есть две кнопки "Следующий элемент" и "Предыдущий элемент" и несколько пользовательских виджетов, содержащих CellList. При нажатии кнопки я вызываю метод моего виджета, который изменяет выбор в CellList, вызывая его SelectionModel:
selectionModel.setSelected(value, true);
Когда я обновляю содержимое CellList, кнопки работают нормально, но когда я выбираю элемент в списке, щелкая по нему, происходит следующее: например, у меня есть элементы {0, 1, 2, 3, 4, ..} на список. Я нажимаю на элемент 1, затем нажимаю кнопку "Следующий элемент" два раза. Эти SelectionChangeEvent происходит:
- Изменить выбор с 1 -> 2 (при первом нажатии кнопки)
- 2 -> 3 (при втором нажатии)
- 3 -> 1
Но после шага 2, если я нажимаю "Предыдущий", он корректно возвращается к элементу 1. Поэтому элемент, который я щелкнул мышью, не позволяет выделению пройти больше, чем один шаг вокруг него.
Я понятия не имею, откуда приходит третье событие. Мое единственное предположение, что событие ручного выбора продолжает ожидаться после стрельбы, но я не знаю, как это проверить. Кто-нибудь знает причину этой проблемы?
UPD:
Я нашел подтверждение, что выделение при нажатии на событие продолжает висеть где-то в EventBus: когда я меняю фильтры поиска, я получаю доступ к SelectionModel так же, как при нажатии кнопки и устанавливаю выделение для первого элемента. Но если пользователь нажимал на CellList до того, как это происходило: во-первых, выбор изменяется на 0, во-вторых, он возвращается к ранее выбранному, если новый выбор данных содержит этот элемент.
upd (для вопроса Юмита):
nextButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
/* Omitting checks that there are elements on the list,
some element is selected and isn't last */
T value = dataProvider.getList().get(currentIndex() + 1);
singleSelectionModel.setSelected(value, true);
singleSelectionModel.isSelected(value);
Element rowElement = cellList.getRowElement(index);
rowElement.scrollIntoView();
}
}
upd: нашел причину этой проблемы: http://code.google.com/p/google-web-toolkit/issues/detail?id=6310
1 ответ
Кажется, вам нужно использовать HandlerRegistration. Так что событие множественного клика не вызывается.
Ссылаться на:
а также