通常Flex与外部数据传递时采用XML/XMLList的方式,而内部数据传输大多采用Array或ArrayCollection的方式。
常用的Array类型通常是:一维数组、二维数组和联合数组等。
ArrayCollection是对Array的包装。包装之后,数据会具有更丰富的数据处理能里。我转的教程说的挺详细,可以看看。
通常的做法是先定义Array,然后将其包装成ArrayCollection。
一、定义Array
1、用AS定义
var arr:Array = new Array("宝马","奔驰","奥迪","面包");
var arr2:Array = ["宝马","面包"];
var arr3:Array = new Array(
{name:"宝马",type:"汽车"},
{name:"奔驰",
{name:"奥迪",
{name:"面包",type:"食物"}
);
2、用标签定义
<mx:Array id="arr">
<mx:String>宝马</mx:String>
<mx:String>奔驰</mx:String>
<mx:String>奥迪</mx:String>
<mx:String>面包</mx:String>
</mx:Array>
2、定义ArrayCollection
现定义Array再包装
var arr:Array = new Array(
?
{name:"宝马",type:"食物"}
?
);
var arrc:ArrayCollection = new ArrayCollection(arr);
或者直接定义:
var arrc:ArrayCollection = new ArrayCollection([
?
{name:"宝马",type:"食物"}
3、添加/移除ArrayCollection项
1)添加项 ?ac.addItemAt({name:"奔驰",0); ?注意是两个参数,不然会报错
?
2)移除项 ?ac.removeItemAt(0); ?注意索引值如果大于ac中的项目,后面的语句不会执行。
3)同时移除多项?
var toRemove:Array = [];
for(var i:int=0; i<tlist0.selectedItems.length;i++)
toRemove.push(tlist0.selectedItems[i]);
for(i=0;i<toRemove.length;i++)
myDP.removeItemAt(myDP.getItemIndex(toRemove[i]));
4)检测ArrayCollecction是否存在某对象
要检查ArrayCollection中是否存在复杂对象,需要比较两个对象的值,例如:
private function checkItem():int
{
var i:int;
var arr:Array = AC.source;
while()
{
if(arr[i].name==nameTI.text && arr[i].age==ageTI.text)
{
return i;
}
i++;
}
return -1;
}
不能用
AC.contains({name:nameTI.text,age:Number(ageTI.text)})
或
AC.getItemIndex({name:nameTI.text,age:Number(ageTI.text)})
因为contains和getItemIndex方法都是比较对象的指针,而不是他们的值。
这里要解释下:
private var arr:Array= new Array(
{name:"奔驰",
{name:"宝马",
{name:"大象",type:"动物"},
{name:"小高",type:"同学"}
);
private var ac:ArrayCollection = new ArrayCollection(arr);
protected function chk():void
{
label1.text = ac.contains({name:"小高",type:"同学"}).toString();
}
这里显示的是false;为什么?上面也说了,因为contains和getItemIndex都是比较对象的指针,而不是值,再来举个例子:
private var obj:Object = {name:“打印机”,type:"办公电器"};
private var arr:Array =?new Array(
{name:"奔驰",type:"同学"},
obj
);
?
protected function chk():void
{
label1.text = ac.contains(obj).toString();
}
这里就会显示true了,也就是说虽然内容一样,但是在内存中的位置不同,那比较出来的就是false
5)监听ArrayCollection数据是否被修改
private var coll:ArrayCollection = new ArrayCollection();
coll.addEventListener(CollectionEvent.COLLECTION_CHANGE,collChangeHandler);
6)遍历ArrayCollection数据
for(var i:int=0; i<ac.length;i++)
{
trace(ac.getItemAt(i).name);
}