首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SelectionModel或ListDataProvider选择CellList中的元素

使用SelectionModel或ListDataProvider选择CellList中的元素
EN

Stack Overflow用户
提问于 2011-08-28 15:21:23
回答 3查看 10K关注 0票数 3

我使用CellList列出我的数据,使用ListDataProvider管理数据,使用SelectionModel从CellList中选择元素并相应地生成事件。

现在,当我使用cellList.getList()、.set(索引、bean)或cellList.getList().remove()来更新或删除元素时,它会成功地执行这些操作。但在那之后,它会自动选择CellList中的第一条记录,这是我不想要的。

有人可以建议如何在CellList中取消选择所选记录吗?

下面是我如何初始化selectionmodel和listprovider的代码:

代码语言:javascript
复制
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);
        }
    });

当我添加新记录时:

代码语言:javascript
复制
dataProvider.getList().add(0, appsBean);

对于更新记录:

代码语言:javascript
复制
AppsBean bean = singleSelectionModel.getSelectedObject();
dataProvider.getList().set(dataProvider.getList().indexOf(bean), appsBean);

对于delete:

代码语言:javascript
复制
int selectedIndex = dataProvider.getList().indexOf(singleSelectionModel.getSelectedObject());
dataProvider.getList().remove(selectedIndex);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-29 15:23:42

您必须实现一个KeyProvider,以确保您选择的DTO即使在对象本身发生更改时也保持不变。

如果你不提供一个KeyProvider,它可能会使用equals来比较对象,如果它们改变了,你可能会遇到问题。

代码语言:javascript
复制
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

代码语言:javascript
复制
 CellList cellList = new CellList(new ContactCell(),keyProvider);

 SelectionModel selectionModel = new SingleSelectionModel(keyProvider);
 cellList.setSelectionModel(selectionModel);

更新取消选择选定对象的工作方式如下:

代码语言:javascript
复制
 Object obj  = selectionModel.getSelectedObject();
 if (obj != null) {
     selectionModel.setSelected(obj,false);
 }
票数 3
EN

Stack Overflow用户

发布于 2013-06-18 04:09:07

我在GWT2.5.1中也遇到了同样的问题。以编程方式取消选择对象是不起作用的:当我从数据提供程序列表中删除对象时,下一行被选中(取消选择引发了另一个不需要的事件)。解决方案是这样做:

代码语言:javascript
复制
selectionModel.getSelectedSet().clear();
票数 2
EN

Stack Overflow用户

发布于 2014-05-04 05:16:14

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

经过几个小时的谷歌搜索后,我发现当键盘策略是:

代码语言:javascript
复制
KeyboardSelectionPolicy.BOUND_TO_SELECTION

如果选择KeyboardSelectionPolicy.DISABLED,则不能按键盘向上/向下列出,但解决了选择第一行的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7219572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档