2013-09-30 8 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.

Verwandte Themen