我在对话框打开时可能会更改FilteredItemsSelectionDialog
底层数据模型。如果有结构更改,即添加或删除元素,我无法告诉对话框更新其过滤列表。
我尝试调用refresh()
和reloadCache()
以及scheduleRefresh()
(基本上在作业中运行reloadCache()
),但所有方法都会重复使用最初添加的元素到内容提供商。
我认为可以解决问题的方法是重置内容提供商并让其再次呼叫fillContentProvider()
。然后我可以使用模型的当前状态重新填充内容提供者。当然,同时保留当前的过滤器和选择。
[开始编辑]
根据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()
以恢复匹配的元素。 / p>
但是当添加一个元素而删除另一个元素时,结果是删除的元素仍然可见。
我还尝试过让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
重置并重新填充其内容提供商?
答案 0 :(得分:2)
如果我正确地阅读了代码,则applyFilter
将重新运行所有代码以填充表格,包括调用fillContentProvider
。
在检查是否需要执行applyFilter
次调用createFilter
时,必须返回一个过滤器,并且与前一个过滤器相比,过滤器的ItemsFilter.equalsFilter
方法必须返回false