我有一个带有异步数据提供程序的单元格表。如果我通过数据提供程序更新数据,表会正确呈现新数据,但选择模型仍然保留并返回旧对象。
你知道如何刷新选择模型吗?
发布于 2011-09-28 21:23:04
我认为您应该使用适当的ProvidesKey使您的SelectionModel与同一“逻辑”对象的不同实例一起工作。例如,您可以使用在对象上调用getId的ProvidesKey,这样具有相同ID的两个对象将被视为相等;因此,即使SelectionModel保留旧对象,当您为它提供新对象时,它仍然可以回答“是,它被选中了”。
仅供参考,这正是EntityProxyKeyProvider所做的(使用代理的stableId )。当您没有指定SimpleKeyProvider时,默认情况下会使用该对象本身作为它的键。
发布于 2013-02-12 15:43:42
我也遇到了同样的问题。目前,我将此作为单选模型。
SelectedRow =在选择它时存储它。
然后,当重新加载数据时,您可以通过以下方式清除它
celltable.getSelectionModel().setSelected(SelectedRow,false);
我想这对你来说太晚了,但希望它能帮助其他人。
发布于 2013-09-11 02:59:38
下面是我手动刷新SelectionModel的方法。这允许您在需要时使用selectedSet(),它将实际包含当前数据,而不是旧数据-包括删除删除的行和更新的字段!
我已经包含了一些扩展DataGrid的类的片段。这至少应该有解决问题的所有逻辑。
当一行被选中时,调用saveSelectionKeys().
。
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;
}
}https://stackoverflow.com/questions/7581628
复制相似问题