如何刷新FilteredItemsSelectionDialog

时间:2016-02-13 15:38:58

标签: eclipse eclipse-plugin eclipse-rcp

我在对话框打开时可能会更改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重置并重新填充其内容提供商?

1 个答案:

答案 0 :(得分:2)

如果我正确地阅读了代码,则applyFilter将重新运行所有代码以填充表格,包括调用fillContentProvider

在检查是否需要执行applyFilter次调用createFilter时,必须返回一个过滤器,并且与前一个过滤器相比,过滤器的ItemsFilter.equalsFilter方法必须返回false