3

我使用 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);
4

3 回答 3

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;
    }
};

然后你必须用这个 keyProvider 初始化 CellTable 和 selectionModel

 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);
 }
于 2011-08-29T07:23:41.523 回答
2

我在使用 GWT 2.5.1 时遇到了同样的问题。以编程方式取消选择对象不起作用:当我从数据提供者列表中删除对象时选择了下一行(并且取消选择引发了另一个不需要的事件)。解决方案是:

selectionModel.getSelectedSet().clear();
于 2013-06-17T20:09:06.977 回答
0

我有同样的问题:@vbjain 写道:现在,当我使用它更新或删除元素时cellList.getList().set(index, bean)cellList.getList().remove()它成功地执行了操作。但之后它会自动选择CellList我不想要的第一条记录。

经过数小时的谷歌搜索后,我发现它发生在键盘策略为:

KeyboardSelectionPolicy.BOUND_TO_SELECTION

如果选择KeyboardSelectionPolicy.DISABLED,则无法通过键盘上/下列出,但选择第一行的问题已解决。

于 2014-05-03T21:16:14.437 回答