2010-10-31 8 views
1

Dans l'exemple de travail suivant, l'index sélectionné de la liste est supposé être réinitialisé à 0 chaque fois que la zone de texte change.Pourquoi SelectedIndex ne fonctionne-t-il pas toutes les deux fois dans Flex 4?

Cependant, pour une raison quelconque, toutes les autres touches l'élément sélectionné disparaît puis réapparaît à la frappe suivante.

<?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" minWidth="955" minHeight="600"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayList; 
      import mx.core.UIComponent; 
      import mx.events.FlexEvent; 

      import spark.effects.Scale; 
      import spark.events.TextOperationEvent; 

      [Bindable] 
      public var items : ArrayList; 

      protected function textinput1_changeHandler(event:TextOperationEvent):void 
      { 
       items = new ArrayList(input.text.split(" ")); 
       list.selectedIndex = 0; 
      } 
     ]]> 
    </fx:Script> 
    <s:TextInput x="165" y="124" change="textinput1_changeHandler(event)" id="input" text="a few words"/> 
    <s:List x="165" y="184" width="433" height="291" dataProvider="{items}" id="list"></s:List> 
</s:Application> 
+3

Avez-vous essayé de compensation et la définition des éléments du fournisseur de données au lieu d'attribuer des nouveaux chaque frappe? – Dan

+0

oui, cela résout le problème. pas clair cependant pourquoi il devrait agir comme il le fait avec le code donné. –

Répondre

0

Vous devez d'abord vérifier la fonction "String.split". Il a plusieurs bugs, je ne m'en souviens pas. Essayez-le sur une séquence comme "" ou "blah" (espace à la fin).

Vous devriez également attendre que la liste soit réellement mise à jour. La modification de la propriété bindable déclenche uniquement un événement, sans modifier réellement la liste (AFAIK). Juste les événements google List. Vous pouvez également essayer de remplacer le paramètre "dataProvider" de List.

0

Le problème est que votre liste n'est pas encore rendue, lorsque vous définissez l'index sélectionné.

Changer votre méthode textinput1_changeHandler va résoudre ce problème:

protected function textinput1_changeHandler(event:TextOperationEvent):void 
{ 
    items = new ArrayList(input.text.split(" ")); 
    callLater(function():void{list.selectedIndex = 0;}); 
} 
0

Ajouter dans votre fonction une actualisation du fournisseur de données d'abord il ramasse les changements:

protected function textinput1_changeHandler(event:TextOperationEvent):void 
{ 
    items = new ArrayList(input.text.split(" ")); 
    (list.dataProvider as ArrayCollection).refresh(); 
    list.selectedIndex = 0; 
} 
0

La raison de l'arrière et en avant est que l'événement est seulement créer avec les changements d'index, consultez listbase le setselectedindex;

le correctif avant de modifier selectedIndex à 0 est de changer d'abord à -1 puis à 0.

/** 
* @private 
* Used internally to specify whether the selectedIndex changed programmatically or due to 
* user interaction. 
* 
* @param dispatchChangeEvent if true, the component will dispatch a "change" event if the 
* value has changed. Otherwise, it will dispatch a "valueCommit" event. 
*/ 
mx_internal function setSelectedIndex(value:int, dispatchChangeEvent:Boolean = false):void 
{ 
    if (value == selectedIndex) 
     return; 

    if (dispatchChangeEvent) 
     dispatchChangeAfterSelection = dispatchChangeEvent; 
    _proposedSelectedIndex = value; 
    invalidateProperties(); 
}