我有两个按钮“下一个元素”和“上一个元素”以及一些包含 CellList 的自定义小部件。在单击按钮时,我调用我的小部件的方法,该方法通过调用它的 SelectionModel 来更改 CellList 中的选择:
selectionModel.setSelected(value, true);
当我刷新 CellList 的内容时,按钮工作得很好,但是当我通过单击它来选择列表中的元素时,会发生这种行为:例如,我有元素 {0, 1, 2, 3, 4, ..} 在列表。我单击元素 1,然后按两次“下一个元素”按钮。这些 SelectionChangeEvent 发生:
- 从 1 -> 2 更改选择(第一次按下按钮时)
- 2 -> 3(第二次按下)
- 3 -> 1
但是在第 2 步之后,如果我按“上一步”,它会正确返回到元素 1。所以我用鼠标单击的元素不会让选择超过 1 步。
我不知道第三个事件是从哪里来的。我唯一的猜测是手动选择事件在触发后继续挂起,但我不知道如何检查。有人知道这个问题的原因吗?
upd:
我发现通过单击事件进行选择的确认继续挂在 EventBus 中的某处:当我更改搜索过滤器时,我访问 SelectionModel 的方式与单击按钮时相同,并将选择设置为第一个元素。但是,如果在此之前有用户单击 CellList,则会发生同样的事情:首先,选择更改为 0,其次,如果新的数据选择包含该元素,它会返回到先前选择的状态。
upd(对于Ümit的问题):
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();
}
}
更新:找到导致此问题的原因: http ://code.google.com/p/google-web-toolkit/issues/detail?id=6310