我有一個FilteredItemsSelectionDialog
shose基礎數據模型可能會在對話框打開時更改。如果結構發生變化,即元素被添加或刪除,我無法告訴對話框更新其過濾列表。如何刷新FilteredItemsSelectionDialog
我打過電話refresh()
和reloadCache()
也scheduleRefresh()
(基本上在作業運行reloadCache()
),但所有的方法重新使用最初加入到內容提供商的元素。
我認爲可以解決這個問題的方法是重置內容提供者並讓它再次調用fillContentProvider()
。然後我可以用模型的當前狀態重新填充內容提供者。當然,保留當前的過濾器和選擇。
[BEGIN編輯]
基於Greg的答案這裏是我也試過:
ItemsFilter overrideFilter;
@Override
protected ItemsFilter createFilter() {
if(overrideFilter != null) {
return overrideFilter;
}
return new LaunchConfigItemsFilter();
}
public void forceRefresh() {
overrideFilter = new ItemsFilter() {
@Override
public boolean matchItem(Object item) {
return false;
}
@Override
public boolean isConsistentItem(Object item) {
return false;
}
@Override
public boolean equalsFilter(ItemsFilter filter) {
return false;
}
@Override
public boolean isSubFilter(ItemsFilter filter) {
return false;
}
};
applyFilter();
overrideFilter = null;
applyFilter();
}
forceRefresh()
被稱爲每當模型結構的變化。其意圖是首先用一個過濾器呼叫applyFilter()
,該過濾器永遠不會與現有過濾器匹配,從而觸發fillContentProider()
,然後再次使用當前過濾器調用applyFilter()
以恢復匹配的元素。
但是,當一個元素被添加,另一個被刪除時,結果是被刪除的元素仍然可見。
我也試過的是讓createFilter()
返回null
第一次打電話給applyFilter()
。這又使被刪除的元素可見。
無論在添加和刪除元素之前是否設置了配件,只有在我清除並(重新)輸入過濾器後,該列表纔會處於有意義的狀態。
[編輯完]
給予一定的情況下,在問題清單的啓動配置對話框,該代碼可以在這裏找到: https://github.com/rherrmann/eclipse-extras/blob/master/com.codeaffine.extras.launch/src/com/codeaffine/extras/launch/internal/dialog/LaunchSelectionDialog.java
有誰知道一個辦法迫使FilteredItemsSelectionDialog
復位和重新填充其內容提供商?
感謝您的回答。我已經在'applyFilter'上擺弄過。我編輯了這個問題以包含我想出的內容。 –
我放棄了。如果列表未經過濾(最困難的情況),則需要用非空虛擬過濾器調用'applyFilter()',並等待它調度的兩個作業(這對於將事件置於正確狀態下一步),然後再用真實(空)過濾器調用'applyFilter()'。這對我的品味來說太過分了。再次感謝您的幫助。 –