2013-09-30 39 views
6

Pracuję nad aplikacją Eclipse RCP i próbuję użyć implementacji ILazyTreeContentProvider, aby wyświetlić tylko widoczne elementy w określonym czasie.Implementacja Eclipse RCP - ILazyTreeContentProvider jest niespodziewanie chętna

Kod:

Wewnątrz klasy rozszerzające 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(); 
    } 

Wewnątrz 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); 
      } 

     } 

Problemem jest to, że za każdym razem poszerzyć dzieci w treeitem, to ładuje wszystkie podelementy, nie tylko te widoczne, natomiast polecenie System.out.println(updateElementCounter++); wypisuje wszystkie 22, mimo że widocznych jest tylko 7 elementów drzewa.

enter image description here

nie Jeżeli ILazyTreeContentProvider załadować tylko te, które są widoczne? (W tym przypadku jest to 7 pozycji)

muszę robić coś złego ...

Anyways, wszystkie opinie są bardzo mile widziane!

Odpowiedz

4

Mam porównaniu moim przykładem z this one I znalazłem tylko jedną różnicą, że dołożył wszelkich różnicę:

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

Co stany metoda w jego Doc:

Konfiguruje czy Przeglądarka strukturalna wykorzystuje wewnętrzną tablicę haszującą , aby przyspieszyć mapowanie elementów i elementów SWT. Musi to być wywołana, zanim przeglądarka otrzyma dane wejściowe (przez setInput).

Teraz dostawca treści jest rzeczywiście leniwy. Tylko maluje widoczne przedmioty, a nie WSZYSTKIE.