开发者

Get item by index in a tree control

I'm doing a drag and drop operation on a tree using some help from Adobe's quick Starts: http://www.adobe.com/devnet/flex/quickstart/working_with_tree/

The code suggested is roughly this:

var dropTarget:Tree = Tree(evt.currentTarget);
var i:int = dropTarget.calculateDropIndex(evt);
myTree.selectedIndex = i;
var node:XML = myTree.selectedItem as XML;
var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem);
if(node.localName() != drugXML.localName()){
    DragManager.showFeedback(DragManager.NONE);
    return;
}else{
    DragManager.showFeedback(DragManager.COPY);
}

This is all well and good, but I don't like the way it is selecting(highlighting) each item in the tree I'm dropping on, it's less clear where the item is going to drop. I want to implement this without the selection but there doesn't seem to be a way to get the XML of the node using just the index. I would like something l开发者_StackOverflow社区ike this:

var dropTarget:Tree = Tree(evt.currentTarget);
var i:int = dropTarget.calculateDropIndex(evt);

var node:XML = myTree.itemAt(i) as XML; 
//AFAIK itemAt(i) or anything like it does not exist

var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem);
if(node.localName() != drugXML.localName()){
    DragManager.showFeedback(DragManager.NONE);
    return;
}else{
    DragManager.showFeedback(DragManager.COPY);
}

So does anyone know what function is, or what I can do to extend the tree to have a function, like "itemAt(i)"

Thanks ~Mike

EDIT: I forgot to post that my current workaround is setting the selectedIndex = -1 after I get my node:XML. I'm afraid that if something bogs on the processor the user may see it select then deselect.


Much simpler, though there may be gotchas:

var index:int = ...
var renderer:IListItemRenderer = tree.indexToItemRenderer(index);
var item:Object = renderer.data;

This won't work if the index is offscreen (since there might not be an active itemRenderer); shouldn't be an issue for drag and drop.


If your dataProvider is explicitly or implicitly a collection (see the linked docs for conversion rules), you should be able to use getItemAt to resolve the index.

It appears that an XML provider will be converted implicitly:

var tree:Tree = ...;
var data:XML = ...;
tree.dataProvider = data; // could just as well be from MXML

var provider:ICollectionView = tree.collection; // tree converted it for us
trace(provider.getItemAt(index));

If you have something other than the convertible types (XML, Array, etc.), you might consider wrapping your dataProvider in an XMLListCollection or what have you to gain access to that method.


The above is aiming in the right direction but missing.

Turns out you don't want the dataProvider since Tree overrides that; you want the collection property (protected). So you could override Tree and provide an indexToItem method to go with the thisToThat methods already present in Tree.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜