Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 在树控件中按索引获取项_Apache Flex_Actionscript 3_Tree - Fatal编程技术网

Apache flex 在树控件中按索引获取项

Apache flex 在树控件中按索引获取项,apache-flex,actionscript-3,tree,Apache Flex,Actionscript 3,Tree,我正在使用Adobe快速入门的一些帮助在树上执行拖放操作: 建议的代码大致如下: 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

我正在使用Adobe快速入门的一些帮助在树上执行拖放操作:

建议的代码大致如下:

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);
}
这一切都很好,但我不喜欢它在我放置的树中选择(突出显示)每个项目的方式,它不太清楚该项目将放置在何处。我想在没有选择的情况下实现这一点,但似乎没有一种方法可以仅使用索引获取节点的XML。我想要这样的东西:

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);
}
那么,有人知道什么是函数吗?或者我可以做些什么来扩展树,使其具有函数,比如“itemAt(I)”

谢谢 ~z~迈克

编辑:我忘记发布我当前的解决方法是在获得node:XML后设置selectedIndex=-1。我担心,如果处理器上出现问题,用户可能会看到它先选择,然后再取消选择。

如果您显式或隐式地是一个集合(有关转换规则,请参阅链接文档),您应该能够使用来解析索引

似乎将隐式转换
XML
提供程序:

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

如果你有其他的可转换类型(XML,数组等),你可以考虑在<代码> XMListListCys中包装<代码>数据提供者< /> >,或者你有什么方法访问该方法?


上面的内容瞄准了正确的方向,但没有


结果表明,您不需要
数据提供程序
,因为
覆盖了它;您希望该属性(受保护)。因此,您可以覆盖树并提供一个
索引项
方法来与
一起使用,以使
树中已经存在的
方法更加简单,尽管可能存在以下问题:

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

如果索引在屏幕外,这将不起作用(因为可能没有活动的itemRenderer);这不应该是拖放的问题。

我认为只要你停留在单线程中(并且不触发任何validateNows),你就不会受到视觉反馈的影响——Flex框架将没有机会更新UIComponents。我看到其他人提到线程,我不知道他们指的是什么,从这个意义上讲,什么是一个线程?我如何生成另一个线程,或者如何确保我只在一个线程中?我将为此发布另一个问题…我的数据提供程序是XML类型。当我将其设置为XMLListCollection时,我遇到了一些问题(可能是我自己缺乏技能),无法使其与我的应用程序的其余部分一起工作。添加了一些关于Flex如何将XML转换为集合的说明。我尝试了您的建议,它告诉我getItemAt()不是ICollectionView的方法。所以我只是做了“trace(tree.dataProvider.getItemAt(I)),因为文档说它自动转换为列表集合,这应该没有问题。当我运行代码时,它崩溃了,说索引超出了界限。为什么会这样?顺便说一句,我得到了一些关于线程的好答案,所以至少我知道我对你在对问题的评论中所说的很好。我又做了一些工作,加入了一个断点来分析树。dataprovider,它是一个XMLListCollection,但只有包含我树的XML的0索引。所以getItemAt失败是有道理的。是的,我认为这条路是一条错误的线索。我要再试一次。=)感谢您的努力,对于树没有ItemRenderToItem方法,我可以使用ItemRenderToIndex,但是我们又回到了开始的地方:-)抱歉--itemRenderer已经拥有了数据,不需要aToB函数。耶!最新编辑作品!谢谢Michael,我们应该可以用rep来为像你这样的人买啤酒。哦,如果有人需要自己尝试,你应该用“if(tree.indexToItemRenderer(index))”来包装Michael的解决方案,出于某种原因,如果您拖动鼠标越过列表的底部,索引值会一直向上移动,因此当您尝试为其赋值时,会出现null ref错误。