6

私は 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++);7 つのツリー項目しか表示されていないにもかかわらず、コマンドは 22 個すべてを出力することです。

ここに画像の説明を入力

ILazyTreeContentProvider表示されているものだけをロードするべきではありませんか? (この場合は7項目です)

私は何か間違ったことをしているに違いない...

とにかく、どんな意見でも大歓迎です!

4

1 に答える 1

4

私は私の例をこれと比較し ました.そして、すべての違いを生む唯一の違いを見つけました:

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

メソッドがそのドキュメントで述べていること:

この構造化ビューアーが内部ハッシュ テーブルを使用して要素と SWT アイテム間のマッピングを高速化するかどうかを構成します。これは、(setInput を介して) ビューアーに入力が与えられる前に呼び出す必要があります。

現在、コンテンツ プロバイダーは実際には怠け者です。すべてではなく、表示されているアイテムのみをペイントします。

于 2013-10-01T12:11:42.367 に答える