2013-05-15 95 views
4

我正在实现像Windows资源管理器这样的目录结构。我想之后的任何文件夹操作重新渲染树的特定节点完成,如添加文件夹,删除文件夹...等如何重新呈现gwt细胞树中的特定节点

private ListDataProvider<Object> dataProvider= new ListDataProvider<Object>(); 

private Object current;//store object of currentNode; 

private Map<Object, ListDataProvider<Object>> keyprovider = 
    new HashMap<Object,ListDataProvider<Object>>(); 

private CellTree tree; 

// keeps a map for storing dataproviders in each hierarchy , 

public void setListToCurrentNode(List<Object> newList){ 

    //adding this newlist to current data provider not reflecting to display 
    keyprovider.get(currentObject).setList(newList); 

} 

public void onModuleLoad(){ 

    treeSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { 

     public void onSelectionChange(SelectionChangeEvent event) { 

      //setting current object as selected node 
      current = treeSelectionModel.getSelectedObject(); 

     } 
    }); 

} 
+0

代码..... –

回答

0

通过Listdataprovider改变成AsyncDataProvider解决,实现低于加入

private final class DataProvider extends AsyncDataProvider<Object> { 

    private Object value; 
      private List Objs; 

    DataProvider(Object value) { 
     this.value = value; 
    } 


    public void update(List objs) {//Call update when you wanted to refresh tree 
        this.objs=objs; 
     for (HasData<Object> disp : getDataDisplays()) { 
      this.onRangeChanged(disp); 
      break; 
     } 
    } 

    @Override 
    protected void onRangeChanged(final HasData<Object> display) { 

            updateRowData(0, objs); 
       updateRowCount(objs.size(), true); 

      } 
1

数据提供商力重新渲染相应的DOM。下面的代码演示了它如何工作。 本示例生成2级树,您可以通过在所选根节点上按Enter键来刷新(重新生成)叶节点。

我试着让代码尽可能简单,所有需要的东西都包含在这里。

public class TestEntryPoint implements EntryPoint { 

    private static final Logger LOG = Logger.getLogger(TestEntryPoint.class.getName()); 

    class Item { 

     String name; 
     boolean leaf; 

     public Item(String name, boolean leaf) { 
      this.name = name; 
      this.leaf = leaf; 
     } 

     @Override 
     public String toString() { 
      return "Item {name=" + name + ", leaf=" + leaf + "}"; 
     } 
    } 

    class ItemCell extends AbstractCell<Item> { 

     public ItemCell() { 
      super("keydown"); 
     } 

     @Override 
     public void render(Context context, Item value, SafeHtmlBuilder sb) { 
      if (value != null) sb.appendEscaped(value.name); 
     } 

     @Override 
     protected void onEnterKeyDown(
       Context context, Element parent, Item value, NativeEvent event, ValueUpdater<Item> valueUpdater) { 
      LOG.info("ItemCell.onEnterKeyDown: value=" + value); 
      if (value == null || value.leaf) return; 
      ListDataProvider<Item> leafDataProvider = leafDataProviders.get(value.name); 
      if (leafDataProvider == null) return; 
      // -->> Here we generate new childs of selected root node 
      leafDataProvider.setList(generateLeafs()); 
     } 
    } 

    class ItemTreeViewModel implements TreeViewModel { 

     @Override 
     public <T> NodeInfo<?> getNodeInfo(T value) { 
      return new DefaultNodeInfo<Item>(
       value == null ? rootDataProvider : leafDataProviders.get(((Item) value).name), 
       new ItemCell()); 
     } 

     @Override 
     public boolean isLeaf(Object value) { 
      return (value instanceof Item) && ((Item) value).leaf; 
     } 
    } 

    private int id = 0; 
    private CellTree cellTree; 
    private ListDataProvider<Item> rootDataProvider; 
    private Map<String, ListDataProvider<Item>> leafDataProviders = new HashMap<String, ListDataProvider<Item>>(); 

    private List<Item> generateLeafs() { 
     List<Item> leafList = new ArrayList<Item>(5); 
     for (int j = 0; j < 5; ++j) 
      leafList.add(new Item("Leaf Item " + (++id), true)); 
     return leafList; 
    } 

    public void onModuleLoad() { 
     List<Item> rootList = new ArrayList<Item>(10); 
     for (int i = 0; i < 10; ++i) { 
      Item rootItem = new Item("Root Item " + (++id), false); 
      rootList.add(rootItem); 
      leafDataProviders.put(rootItem.name, new ListDataProvider<Item>(generateLeafs())); 
     } 
     rootDataProvider = new ListDataProvider<Item>(rootList); 

     cellTree = new CellTree(new ItemTreeViewModel(), null); 
     cellTree.setAnimationEnabled(true); 
     RootLayoutPanel.get().add(cellTree); 
    } 
}