【问题标题】:How to re-render a specific node in gwt cell tree如何重新渲染 gwt 单元树中的特定节点
【发布时间】:2013-05-15 14:28:58
【问题描述】:

我正在实现一个目录结构,如 Windows 资源管理器。我想在完成任何文件夹操作(例如添加文件夹、删除文件夹...等)后重新渲染树的特定节点

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

        }
    });

}

【问题讨论】:

    标签: gwt tree cell dataprovider


    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      通过将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);
      
                 }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        相关资源
        最近更新 更多