2016-02-13 75 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()'。这对我的品味来说太过分了。再次感谢您的帮助。 –