セル ツリーを使用していますが、この問題
があります。RPC 呼び出しを介してデータを取得します。ノードが葉であるかどうかは、その子について取得したデータに基づいて決定します。たとえば、ノードに「foo」と呼ばれる息子がいる場合、このノードはリーフである必要があります。
このノードをリーフにして、その子をツリーに表示しないようにする方法がわかりません。(代わりに、ノードをクリックしたときに別の場所に表示したい)
可能ですか? 誰にもアイデアはありますか?
私を助けてください、私は2日間それで立ち往生しています...
ありがとう!
質問する
815 次
2 に答える
0
各ノードにタイプがある場合、TreeViewModelimplに子を持つことが期待されていないタイプのリストまたはマップを作成できますか?
実装では、すべてのタイプにメタモデルを使用しましたが、必須ではありません。
例えば、
@Override
public boolean isLeaf(Object value) {
boolean result = true;
if (value == null) {
result = false; // assumes all root nodes have children
} else if (value instanceof NavNode) {
final NavNode currentNode = (NavNode) value;
final NodeType currentNodeType = NodeType.fromValue(currentNode.getType());
if (currentNode.hasChildren() || NodeHelper.couldHaveChildren(currentNodeType)) {
result = false;
}
}
return result;
}
// Create a data provider for root nodes
protected ListDataProvider<NavNode> getDataProvider(Collection<NavNode> rootNodes) {
return new ListDataProvider<NavNode>(new LinkedList<NavNode>(rootNodes));
}
// Create a data provider that contains the immediate descendants.
protected AsyncDataProvider<NavNode> getDataProvider(final NavNode node) {
return new AsyncDataProvider<NavNode>() {
@Override
protected void onRangeChanged(final HasData<NavNode> display) {
final Set<NavNode> clientNodes = util.getAncestorNodes(node);
clientNodes.add(node);
final NavigationInfo clientInfo = new NavigationInfo(clientNodes);
navigationService.getNavInfo(clientInfo, node, resources, qualifications, new SafeOperationCallback<NavigationInfo>(eventBus, false) {
@Override
public void onFailureImpl(Throwable caught) {
GWT.log("Something went wrong retreiving children for " + node.getName(), caught);
updateRowCount(0, false);
}
@Override
public void onSuccessImpl(OperationResult<NavigationInfo> or) {
util.mergeNavInfo(or.getResult());
final NavNode nodeFromServer = util.getNode(node.getId());
final Range range = display.getVisibleRange();
final int start = range.getStart();
final Set<NavNode> nodes = util.getNodes(nodeFromServer.getChildren());
updateRowData(display, start, new LinkedList<NavNode>(nodes));
}
});
}
};
}
private static class NodeHelper {
private static final Set<NodeType> PARENTAL_NODE_TYPES;
static {
PARENTAL_NODE_TYPES = new HashSet<NodeType>();
PARENTAL_NODE_TYPES.add(NodeType.ASSET_OWNER);
PARENTAL_NODE_TYPES.add(NodeType.OPERATING_DAY);
PARENTAL_NODE_TYPES.add(NodeType.RESOURCES);
PARENTAL_NODE_TYPES.add(NodeType.RESOURCE);
PARENTAL_NODE_TYPES.add(NodeType.ENERGY);
PARENTAL_NODE_TYPES.add(NodeType.RESERVE);
PARENTAL_NODE_TYPES.add(NodeType.DAY_AHEAD_CLEARED_OFFERS);
PARENTAL_NODE_TYPES.add(NodeType.DRR_LOAD_FORCAST);
PARENTAL_NODE_TYPES.add(NodeType.RESERVE_DISPATCH);
PARENTAL_NODE_TYPES.add(NodeType.RESERVE_RAMP_RATE);
}
public static boolean couldHaveChildren(NodeType nodeType) {
boolean result = false;
if (PARENTAL_NODE_TYPES.contains(nodeType)) {
result = true;
}
return result;
}
}
}
于 2012-11-04T15:59:16.363 に答える
0
isLeaf() メソッドをオーバーライドして、true または false を返すことができます。
ただし、UI の観点からは問題があります。ユーザーがノードをクリックする前は、これがノードなのかリーフなのかわかりません。私はそのような実装を複数回見ましたが、これは少し紛らわしいです。ツリーがそれほど大きくない場合は、すべてのデータを一度にロードしてから、必要に応じてノードまたはリーフを作成して、必要な方法で構築することを検討してください。
于 2012-11-04T03:44:37.093 に答える