2016-02-13 68 views
1

我有一個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復位和重新填充其內容提供商?

回答

2

如果我正確地讀取了代碼,調用applyFilter將重新運行所有代碼來填充表格,包括調用fillContentProvider

當檢查是否需要做任何事情applyFilter調用createFilter,這必須返回一個過濾器和過濾器的ItemsFilter.equalsFilter方法時,與以往相比,過濾器必須返回false。

+0

感謝您的回答。我已經在'applyFilter'上擺弄過。我編輯了這個問題以包含我想出的內容。 –

+0

我放棄了。如果列表未經過濾(最困難的情況),則需要用非空虛擬過濾器調用'applyFilter()',並等待它調度的兩個作業(這對於將事件置於正確狀態下一步),然後再用真實(空)過濾器調用'applyFilter()'。這對我的品味來說太過分了。再次感謝您的幫助。 –