Eclipse RCP - ILazyTreeContentProvider实现是意外的渴望 [英] Eclipse RCP - ILazyTreeContentProvider implementation is unexpectedly eager

查看:526
本文介绍了Eclipse RCP - ILazyTreeContentProvider实现是意外的渴望的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am developing an Eclipse RCP application, and am trying to use a ILazyTreeContentProvider implementation in order to show only the visible items at a certain time.

代码:

在扩展ViewPart的类中:

Inside the class extending 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内部:

Inside the 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 ++); 命令打印出所有22,尽管有只有7棵树项目可见。

The problem is that each time I expand the children of a TreeItem, it loads all the subelements, not just the visible ones, whereas the System.out.println(updateElementCounter++); command prints out all 22 despite having only 7 Tree Items visible.

不应该 ILazyTreeContentProvider 只加载可见的? (在这种情况下它是7个项目)

Shouldn't the ILazyTreeContentProvider only load the ones that are visible? (In this case it's 7 items)

我必须做错事...

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

Anyways, any opinions are very appreciated!

推荐答案

我将我的例子与这一个
我发现只有一个区别,所有的区别:

I have compared my example with this one And I've found only one difference that made all the difference:

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

文档中说明的方法如下:

What the method states in its doc:


配置此结构化查看器是否使用内部散列表
来加快元素和SWT项之间的映射。在查看器给定输入(通过setInput)之前,这个调用必须是

Configures whether this structured viewer uses an internal hash table to speeds up the mapping between elements and SWT items. This must be called before the viewer is given an input (via setInput).

现在内容提供者实际上是懒惰的。只能画出可见物品,而不是全部。

Now the content provider is actually lazy. Only paints the visible items, not ALL of them.

这篇关于Eclipse RCP - ILazyTreeContentProvider实现是意外的渴望的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆