Eclipse RCP – ILazyTreeContentProvider实现意外地渴望

我正在开发一个Eclipse RCP应用程序,并且我正在尝试使用ILazyTreeContentProvider实现,以便在特定时间仅显示可见项。

代码:

在扩展ViewPart的类中:

 public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL); drillDownAdapter = new DrillDownAdapter(viewer); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); //viewer.setSorter(new NameSorter()); viewer.setInput(getViewSite()); // Create the help context id for the viewer's control PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "test.provider.lazy.viewer"); makeActions(); hookContextMenu(); hookDoubleClickAction(); contributeToActionBars(); } 

在ContentProvider中:

 @Override public void updateElement(Object parent, int index) { System.out.println(updateElementCounter++); if (parent.equals(getViewSite())) { if (index == 0) { TreeParent child = new TreeParent("Parent 1"); viewer.replace(parent, index, child); viewer.setHasChildren(child, true); } else { TreeParent child = new TreeParent("Parent 2"); viewer.replace(parent, index, child); viewer.setHasChildren(child, true); //viewer.setChildCount(child, 1); } } else { if (parent instanceof TreeParent) { TreeParent treeParent = (TreeParent) parent; if (treeParent.getName().equals("Parent 1")) { TreeObject child = new TreeObject("Leaf "+index); viewer.replace(treeParent, index, child); viewer.setHasChildren(child, false); //viewer.setChildCount(child, 0); } else { TreeObject child = new TreeObject("Special One"); viewer.replace(treeParent, index, child); viewer.setHasChildren(child, false); //viewer.setChildCount(child,0); } } } } @Override public void updateChildCount(Object element, int currentChildCount) { if (element.equals(getViewSite())) { viewer.setChildCount(getViewSite(), 2); } else if (element instanceof TreeParent) { TreeParent parent = (TreeParent) element; if (parent.getName().equals("Root")) { viewer.setChildCount(parent, 2); } else if (parent.getName().equals("Parent 1")) { viewer.setChildCount(parent, 20); } else { viewer.setChildCount(parent, 1); } } else { viewer.setChildCount(element, 0); } } 

问题是每次我扩展TreeItem的子System.out.println(updateElementCounter++); ,它都会加载所有子元素,而不仅仅是可见元素,而System.out.println(updateElementCounter++); 命令打印出所有22,尽管只有7个树项目可见。

在此处输入图像描述

ILazyTreeContentProvider只加载那些可见的吗? (在这种情况下,它是7项)

我一定做错了什么…

无论如何,任何意见都非常感谢!

我把我的例子与这个例子进行了比较而且我发现只有一个区别就是差别所在:

 v.setUseHashlookup(true); //v is the TreeViewer 

该方法在其doc中说明了什么:

配置此结构化查看器是否使用内部哈希表来加速元素和SWT项之间的映射。 必须在给观众输入一个输入之前调用它(通过setInput)。

现在内容提供商实际上是懒惰的。 仅绘制可见项目,而不是所有项目。