2013-09-30 15 views
6

Ich entwickle eine Eclipse RCP-Anwendung und versuche eine ILazyTreeContentProvider Implementierung zu verwenden, um nur die sichtbaren Elemente zu einer bestimmten Zeit anzuzeigen.Eclipse RCP - ILazyTreeContentProvider Implementierung ist unerwartet eifrig

Der Code:

Innerhalb der Klasse Viewpart erstreckt:

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(); 
    } 

Innerhalb des 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); 
      } 

     } 

Das Problem ist, dass jedes Mal, wenn ich die Kinder eines TreeItem zu erweitern, es lädt alle Unterelemente, nicht nur die sichtbaren, während der System.out.println(updateElementCounter++); Befehl alle 22 ausgibt, obwohl nur 7 Baumelemente sichtbar sind.

enter image description here

Sollte nicht die ILazyTreeContentProvider nur diejenigen laden, die sichtbar sind? (In diesem Fall ist es 7 Beiträge)

ich falsch etwas tun muss ...

Sowieso sind alle Meinungen sehr geschätzt!

Antwort

4

Ich habe mein Beispiel mit this one Und ich habe nur einen Unterschied gefunden verglichen, die den Unterschied gemacht:

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

Was die Methode heißt es in der doc: ob diese

Konfiguriert Der strukturierte Viewer verwendet eine interne Hash-Tabelle , um das Mapping zwischen Elementen und SWT-Elementen zu beschleunigen. Dies muss aufgerufen werden, bevor der Betrachter eine Eingabe (über setInput) gegeben wird.

Jetzt ist der Inhaltsanbieter eigentlich faul. Zeichnet nur die sichtbaren Objekte, nicht ALLE.