在Gwt TreeViewModel上getNodeInfo()方法

时间:2011-08-24 11:12:56

标签: gwt tree cell dataprovider

我无法理解这一部分,也没有尝试展示示例。

我正在使用AsyncDataProvider的扩展来将我的树绑定到RPC服务。这是我的方法:

public <T> NodeInfo<?> getNodeInfo(T value) {
        /*
        if (value instanceof Categoria) {
            dataProvider.setCurrentParent((Categoria)value);
        }
        */
        return new DefaultNodeInfo<Categoria>(dataProvider, new CategoriaCell());
    }

“currentParent”是我的东西:除了(null =&gt; root)值,我设置父级通过RPC传递给我的服务。实际上,在我的小部件代码中:

dataProvider = new CategorieTreeDataProvider() {            
            @Override
            protected void onRangeChanged(HasData<Categoria> display) {
                updateTree(getCurrentParent());
            }
        };

private void updateTree(Categoria categoria) {
        rpcService.getCategorie(categoria, new AsyncCallback<Categoria[]>() {
            @Override
            public void onSuccess(Categoria[] result) {
                dataProvider.updateRowCount(result.length, true);
                dataProvider.updateRowData(0, Arrays.asList(result));
            }
            @Override
            public void onFailure(Throwable caught) {
                Window.alert(caught.toString());
            }
        });
    }

然而,我的rpc-server代码正在按预期工作:

@Override
    public Categoria[] getCategorie(Categoria parent) {
        List<Categoria> categoryList = categorieDao.listByProperty("parent", parent);
        for (Categoria c : categoryList) {
            if (categorieDao.listByProperty("parent", c).size() == 0) {
                c.setLeaf(true);
            }
        }
        return categoryList.toArray(new Categoria[0]);
    }

**然后我在我的类别中添加一些数据:'GrandFather','Father'和'Son'。

不幸的是,在加载我的小部件后,我看到了:

  • 祖父正确,他的“+”预期如何;

  • 然后我点击它......

  • 祖父消失了,我看到'父亲'和他的'+'

  • 同样适用于父亲 - &gt;子

我怀疑该bug存在于updateRowCount / updateRowData用法中。**

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

每当打开节点时都会调用getNodeInfo,因此您必须为每个节点的子节点创建不同的DataProvider。

public <T> NodeInfo<?> getNodeInfo(T value) {
        if (value == null) {
            return new DefaultNodeInfo<Category>(dataProvider, new CategoriaCell());
        }
        else if (value instanceof Categoria) {
                 Category category  = (Category)value;
             return new DefaultNodeInfo<Grandfather>(new ListDataProvider<Grandfather>(category.getGrandFathers()),new GrandFatherCell());
        }
        else if (value instanceof Grandfather) {
             Grandfather grandfather = (Grandfather)value;
             return new DefaultNodeInfo<Father>(new ListDataProvider<Father>(granfather.getFathers()),new FatherCell());
        }
        else if (value instanceof Father) {
            //same as above but with fathers.
        }
    }

category.getGrandFathers()函数可以例如对服务器执行RPC请求,或者只检索一个RPC请求中的所有内容时返回列表。

根据评论更新:

因此,如果您只有一个类并希望实现动态CellTree(未预先确定级别数),您可以采取以下方法。

public <T> NodeInfo<?> getNodeInfo(T value) {
    if (value == null) {
        return new DefaultNodeInfo<Category>(dataProvider, new CategoriaCell());
    }
    else {
        Category category  = (Category)value;
        return new DefaultNodeInfo<Category>(new ListDataProvider<Category>(category.getSubCategories()),new CategoryCell());
    }
}

category.getSubCategories()是一个RPC调用,它检索当前类别的子类别,或者如果Category类是链表类型数据结构,它只能返回子类别列表。

答案 1 :(得分:0)

每个数据提供者更新给定的“列表”(给定父节点的子节点),因此您必须为每个父节点使用不同的数据提供者实例,否则您的调用将更新一些随机列表。