我无法理解这一部分,也没有尝试展示示例。
我正在使用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用法中。**
有什么想法吗?
答案 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)
每个数据提供者更新给定的“列表”(给定父节点的子节点),因此您必须为每个父节点使用不同的数据提供者实例,否则您的调用将更新一些随机列表。