2011-11-30 63 views
1

的狀態我有CellTable與連接到它MultipleSelectionModel。在對數據進行一些修改後,表必須刷新,並且新數據必須從服務器重新加載。GWT - 記住複選框後RangeChangeEvent發送到表

但是我需要更新複選框狀態爲新加載的數據。所以我能夠使用selectionModel.getSelectedSet()查詢選擇框 - 但現在我需要在表中查找這些對象並「檢查」它們。

由於對象中的變化和因爲它們被用作鍵在地圖內部在GWT組件 - 我被迫寫「包裝」過僅使用ID在等號/的hashCode這些對象的內容。

所以基本上我救selectedSet點火事件之前,然後遍歷並調用的setSelected方法:

Set<T> selectedSet = selectionModel.getSelectedSet(); 
RangeChangeEvent.fire(table,...) 
if (selectedSet != null) 
    for (T obj : selectedSet) { 
     selectionModel.setSelected(obj,true); 
    } 
} 

有沒有更好的方法嗎?

回答

3

這就是ProvidesKey是:創建一個ProvidesKey實例返回你的對象的ID來作爲他們的鑰匙,該實例傳遞給你的選擇模型,當你建立了:

MultiSelectionModel<X> selectionModel = new MultiSelectionModel<X>(new ProvidesKey<X>() { 
    @Override 
    public Object getKey(X item) { 
     return item.getId(); 
    } 
}); 

這樣,在檢索更新後的數據之後,您不應該對您的選擇模型有任何特別的影響:將它推送到您的表中,它會詢問每個對象的選擇模型,無論它是否被選中,並且選擇模型將能夠僅根據對象的ID進行回答,因此重複使用與之前相同的選擇集合。

+0

這是否意味着我不必重寫equals /的hashCode在我的課,但只是表的內容被更新後通過「選擇」的對象? – jdevelop

+0

絕對如此。默認情況下,選擇模型使用['SimpleKeyProvider'](http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/view/client/SimpleKeyProvider.html),它使用以自己爲關鍵;這意味着'equals'和'hashCode'將被用在對象本身上。使用一個提供對象ID的'ProvideKey',將在ID上使用'equals'和'hashCode',而不是你的對象。你不應該有什麼特別的事情要做。在檢索更新後的數據之後的選擇模型,在單元格表上簡單地設置'setRowData'即可完成:選擇模型將僅存儲ID –