首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT SelectionModel正在返回旧的选择

GWT SelectionModel正在返回旧的选择
EN

Stack Overflow用户
提问于 2011-09-28 18:13:52
回答 4查看 4.2K关注 0票数 3

我有一个带有异步数据提供程序的单元格表。如果我通过数据提供程序更新数据,表会正确呈现新数据,但选择模型仍然保留并返回旧对象。

你知道如何刷新选择模型吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-28 21:23:04

我认为您应该使用适当的ProvidesKey使您的SelectionModel与同一“逻辑”对象的不同实例一起工作。例如,您可以使用在对象上调用getIdProvidesKey,这样具有相同ID的两个对象将被视为相等;因此,即使SelectionModel保留旧对象,当您为它提供新对象时,它仍然可以回答“是,它被选中了”。

仅供参考,这正是EntityProxyKeyProvider所做的(使用代理的stableId )。当您没有指定SimpleKeyProvider时,默认情况下会使用该对象本身作为它的键。

票数 4
EN

Stack Overflow用户

发布于 2013-02-12 15:43:42

我也遇到了同样的问题。目前,我将此作为单选模型。

SelectedRow =在选择它时存储它。

然后,当重新加载数据时,您可以通过以下方式清除它

celltable.getSelectionModel().setSelected(SelectedRow,false);

我想这对你来说太晚了,但希望它能帮助其他人。

票数 1
EN

Stack Overflow用户

发布于 2013-09-11 02:59:38

下面是我手动刷新SelectionModel的方法。这允许您在需要时使用selectedSet(),它将实际包含当前数据,而不是旧数据-包括删除删除的行和更新的字段!

我已经包含了一些扩展DataGrid的类的片段。这至少应该有解决问题的所有逻辑。

当一行被选中时,调用saveSelectionKeys().

  • When改变网格数据。调用refeshSelectedSet().

  • If你知道
  1. 的类型,你可以用更容易处理的方法替换isSameKey()方法。这个类使用泛型,所以这个方法试图找出对象转换本身。

代码语言:javascript
复制
public abstract class AsyncDataGrid<T> extends DataGrid<T> {
    ...

    private MultiSelectionModel<T> selectionModel_; 
    private ListDataProvider<T> dataProvider_;
    private List<T> dataList_;      
    private Set<Object> priorSelectionKeySet_;
    private boolean canCompareKeys_;
    ...

    public AsyncDataGrid( final ProvidesKey<T> keyProvider ){
        super( keyProvider );

        ...

        dataProvider_ = new ListDataProvider<T>();         
        dataList_ = dataProvider_.getList();            
        canCompareKeys_ = true;
        ...
    }   

    private void saveSelectionKeys(){
        priorSelectionKeySet_ = new HashSet<Object>();
        Set<T> selectedSet = selectionModel_.getSelectedSet();
        for( Iterator<T> it = selectedSet.iterator(); it.hasNext(); ) {
            priorSelectionKeySet_.add( super.getValueKey( it.next() ) );
        }
    }

    private void refeshSelectedSet(){
        selectionModel_.clear();
        if( priorSelectionKeySet_ != null ){
            if( !canCompareKeys_ ) return; 
            for( Iterator<Object> keyIt = priorSelectionKeySet_.iterator(); keyIt.hasNext(); ) {            
                Object priorKey = keyIt.next();         
                for( Iterator<T> it = dataList_.iterator(); it.hasNext(); ) {
                    T row = it.next();
                    Object rowKey = super.getValueKey( row );
                    if( isSameKey( rowKey, priorKey ) ) selectionModel_.setSelected( row, true );
                }
            }       
        }
    }

    private boolean isSameRowKey( final T row1, final T row2 ) {
        if( (row1 == null) || (row2 == null) ) return false;
        Object key1 = super.getValueKey( row1 );
        Object key2 = super.getValueKey( row2 );
        return isSameKey( key1, key2 );
    }   

    private boolean isSameKey( final Object key1, final Object key2 ){  
        if( (key1 == null) || (key1 == null) ) return false;        
        if(      key1 instanceof Integer ){
            return ( ((Integer) key1) - ((Integer) key2) == 0 );            
        }
        else if( key1 instanceof Long ){
            return ( ((Long) key1) - ((Long) key2) == 0 );          
        }
        else if( key1 instanceof String ){
            return ( ((String) key1).equals( ((String) key2) ) );           
        }       
        canCompareKeys_ = false;
        return false;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7581628

复制
相关文章

相似问题

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