我遇到Spark列表的问题,我试图确保始终选择一个项目,并确保GUI向用户显示该项目。
应用程序(下面的完整代码)创建一个List,一个Label和一个Button。标签说明列表中选择的内容。该按钮删除所选项目。更改选择,更新标签中的文本。 重要:列表将“requireSelection”设置为true,以确保始终选择项目。
如果我选择列表中的第一项,则选择会正确反映在标签中。单击“删除”将删除该项目,并选择下一个项目。这一切都正常。
如果我选择除第一项以外的任何项目,然后单击“删除”,则列表显示为没有选择。但是,Label显示已选择第一个项目。如果我尝试选择第1项(通过点击它),则不会发生任何事情(即该项目看起来没有被选中)。如果我单击其正确选择的任何其他项目,列表似乎再次开始工作。
帮助。这是一个错误还是我需要手动“踢”列表?我应该使用“requireSelection”来强制执行选择吗?
谢谢,
菲尔
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
initialize="init()">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
private function init():void {
myList.addEventListener(FlexEvent.VALUE_COMMIT, updateSelectionLabel);
var ac:ArrayCollection = new ArrayCollection()
ac.addItem("Adam");
ac.addItem("Bob");
ac.addItem("Charlie");
ac.addItem("Dave");
myList.dataProvider = ac;
}
private function updateSelectionLabel(event:Event):void {
selectedItemLabel.text = myList.selectedItem.toString();
}
protected function removeClicked(event:MouseEvent):void {
myList.dataProvider.removeItemAt( myList.selectedIndex );
}
]]>
</fx:Script>
<s:List id="myList" x="10" y="10" width="300" height="120"
requireSelection="true"/>
<s:Label x="10" y="140" id="selectedItemLabel" text="-selectedItem-"/>
<s:Button x="10" y="160" label="Remove Selected Item" click="removeClicked(event)"/>
</s:Application>
答案 0 :(得分:2)
由于某种原因,spark列表中的dataProviderRefreshed操作将当前插入符号索引设置为NO索引。为什么?我不完全确定,但无论如何,解决方案非常简单。
protected function removeClicked(event:MouseEvent):void {
if(myList.dataProvider.length>1){
var delIndex:int = myList.selectedIndex;
myList.selectedIndex = 0;
myList.dataProvider.removeItemAt( delIndex );
}
}
只需将索引设置为0,然后删除它,然后始终正确设置插入符号。
我的代码还假设您无法删除LAST索引,否则您将无法选择任何内容。但如果你愿意,你可以改变它。