2011-08-03 18 views
2

アイテムが常に選択されていることを確認し、GUIに表示されるようにするためにスパークリストに問題があります。アイテムが削除されたときにスパークリストに選択項目が表示されない

アプリケーション(以下の完全なコード)は、リスト、ラベル、ボタンを作成します。ラベルには、リストで選択されているものが表示されます。ボタンは選択した項目を削除します。選択を変更すると、ラベル内のテキストが更新されます。 重要::アイテムが常に選択されるように、リストには「requireSelection」がtrueに設定されています。

リストの最初の項目を選択すると、その項目がラベルに正しく反映されます。 「削除」をクリックすると項目が削除され、次の項目が選択されます。これはすべて正しく動作しています。

最初の項目以外を選択して[削除]をクリックすると、選択肢がないようにリストが表示されます。ただし、ラベルは最初の項目が選択されていることを示します。アイテム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> 

答えて

2

は、スパーク・リストの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インデックスを削除できないと想定しています。そうしないと、何も選択されません。しかし、あなたはそれを変えることができます。

+0

ブリリアント - それは治療を働いた。本当にありがとうございました。 – Phil

+0

私は自分のコードスニペットを更新しました。これまでのコードでは、リストの最初のアイテムが常に削除されていました。更新されたコードは、現在選択されている項目を削除します。申し訳ありません。 –

関連する問題