删除项目时,Spark列表不显示选择

时间:2011-08-03 19:46:51

标签: list flex selection flex-spark

我遇到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>

1 个答案:

答案 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索引,否则您将无法选择任何内容。但如果你愿意,你可以改变它。