通常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:"奔驰",type:"汽车"}, {name:"奥迪",type:"汽车"}, {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:"汽车"}, {name:"奔驰",type:"汽车"}, {name:"奥迪",type:"汽车"}, {name:"面包",type:"食物"}
); var arrc:ArrayCollection = new ArrayCollection(arr); 或者直接定义: var arrc:ArrayCollection = new ArrayCollection([
{name:"宝马",type:"汽车"}, {name:"奔驰",type:"汽车"}, {name:"奥迪",type:"汽车"}, {name:"面包",type:"食物"} 3、添加/移除ArrayCollection项 1)添加项 ac.addItemAt({name:"奔驰",type:"汽车"},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:"奔驰",type:"汽车"}, {name:"宝马",type:"汽车"}, {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:"汽车"}, {name:"宝马",type:"汽车"}, {name:"大象",type:"动物"}, {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); } |