2009-06-12 4 views
1

私はリストオブジェクトを持っており、dataProviderを通じてaddItemを使って項目を追加しています。indexOfを使用してdataProviderにアクセスする

アイテムをリストに追加する前に、重複していないことを確認したいと思います。 dataProviderでindexOfを使用しようとしましたが、nullを返します。私はそれを配列にキャストしようとしましたが、それは動作しますが、要素がdataProviderに存在する場合でも常に-1を返します。

私が使用できる唯一の方法はちょっとハックしたようですが、dataProviderで要素を見つけるより良い方法があるかどうかを知りたいと思います。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" styleName="plain" applicationComplete="init()"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.List; 
      [Bindable] 
      public var testListArray:Array; 


      public function init():void 
      { 
       testList.dataProvider.addItem('test'); 
       testList.dataProvider.addItem('banana'); 

       //search for element in dataProvider 
       if(testList.dataProvider.toString().indexOf('banana') > -1) 
       { 
        trace('found'); 
       } 

       //search for element in dataProvider 
       if(testList.dataProvider.toString().indexOf('goat') === -1) 
       { 
        trace('not found'); 
       } 
      } 
     ]]> 
    </mx:Script> 
    <mx:List dataProvider="{testListArray}" x="260" y="204" id="testList" borderStyle="solid" borderColor="#000000"></mx:List> 
</mx:Application> 

答えて

4

dataProviderプロパティに配列を渡しても、基になるdataProviderは常にArrayCollection型で、配列ではありません。これは、入力として配列をサポートしていますが、コンストラクタを使用してArrayCollectionのためにそれらを変換します

ArrayCollection(source:Array) 

あなたは、以下の方法で使用することができます:あなたは、重複する項目を追加していないことを確認するために

ArrayCollection.contains(item:Object):Boolean 

を。

+0

ありがとうございます。それは完璧に働いた!私はdataProviderのcontainsメソッドを使いました。これは、私が望むやり方で動作します。 – metric152

+0

うれしい私は助けることができました! –

0

リストを基になるデータの変更とともに変更する場合は、Arrayの代わりにArrayCollectionを使用する必要があります。

あなたの問題は、toString()関数を使用しているようです。

dataProvider.toString()を実行すると、配列を文字列に変換してから文字列を検索します。

また、配列にはaddItem()関数がありません。代わりにpush()を使用する必要があります。 addItemはArrayCollectionsのためのものです。

+0

変数 "arr"は常にnullになります。その理由から、julotlafriteを参照してください。 –

0

あなたはまだアレイを使用することができますが、それはArrayCollectionのと同じように、動的ではありません...

public function addToArray(item:String):void { 
    if (testListArray.indexOf(item) < 0){ 
     testListArray.push(item); 
     testList.dataProvider = testListArray; 
    } 
} 

あなただけがリストコントロールの作成後にデータを追加している場合は、これを呼び出す必要があります。

関連する問題