2013-09-30 20 views
6

Sto sviluppando un'applicazione RCP Eclipse e sto cercando di utilizzare un'implementazione ILazyTreeContentProvider per mostrare solo gli elementi visibili in un determinato momento.Eclipse RCP - L'implementazione di ILazyTreeContentProvider è inaspettatamente impaziente

Il codice:

All'interno della classe che estende 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(); 
    } 

All'interno del 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); 
      } 

     } 

Il problema è che ogni volta che espandere i figli di un TreeItem, esso carica tutti i sottoelementi, non solo quelli visibili, mentre il comando System.out.println(updateElementCounter++); stampa tutti i 22 nonostante siano visibili solo 7 elementi dell'albero.

enter image description here

Non dovrebbe il ILazyTreeContentProvider caricare solo quelli che sono visibili? (In questo caso si tratta di 7 articoli)

io devo fare qualcosa di sbagliato ...

In ogni modo, gli eventuali pareri sono molto apprezzati!

risposta

4

ho confrontato il mio esempio con this one e ho trovato solo una differenza che ha fatto la differenza:

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

ciò che il metodo afferma nella sua doc:

Configura se questo il visualizzatore strutturato utilizza una tabella hash interna per accelerare la mappatura tra elementi e elementi SWT. Questo deve essere chiamato prima che al visualizzatore venga dato un input (tramite setInput).

Ora il provider di contenuti è in realtà pigro. Dipinge solo gli oggetti visibili, non TUTTI.

Problemi correlati