我有一个列表对象,我正在通过dataProvider使用addItem向其中添加项目。
在将项目添加到列表之前,我想确保它不是重复项。我已经尝试在dataProvider上使用indexOf并返回null。我已经尝试将它转换为数组并且它可以工作,但是即使元素存在于dataProvider中,它总是返回-1。
我能够使用的唯一方法似乎有点hacky,我想知道是否有更好的方法在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>
答案 0 :(得分:4)
即使您将数组提供给dataProvider属性,底层dataProvider也始终是ArrayCollection类型而非Array。它支持数组作为输入,但使用构造函数将它们转换为ArrayCollection:
ArrayCollection(source:Array)
您可以使用以下方法:
ArrayCollection.contains(item:Object):Boolean
确保您没有添加重复项目。
答案 1 :(得分:0)
如果希望更改列表以及更改基础数据,则需要使用ArrayCollection而不是Array。
似乎您的问题是使用toString()函数。它应该是:
var arr:Array = testList.dataProvider as Array;
if(arr)
{
if(arr.indexOf("banana") > -1)
trace("found");
}
当你执行dataProvider.toString()时,将数组转换为字符串,然后搜索字符串。
此外,Arrays没有addItem()函数,您需要使用push()。 addItem用于ArrayCollections。
答案 2 :(得分:0)
您仍然可以使用数组,但它不像ArrayCollection那样是动态的......
public function addToArray(item:String):void {
if (testListArray.indexOf(item) < 0){
testListArray.push(item);
testList.dataProvider = testListArray;
}
}
如果要在创建列表控件后添加数据,则只需要调用此方法。