1.array作为控件使用
   FLEX3写法:
      <mx:Array id="barname">
          <mx:String>Flash</mx:String>
          <mx:String>Director</mx:String>
          <mx:String>Dreamweaver</mx:String>
          <mx:String>ColdFusion</mx:String>
      </mx:Array>
   FLEX4写法:
      <fx:Array id="barname">
          <fx:String>Flex</fx:String>
          <fx:String>Flash</fx:String>
          <fx:String>Dreamweaver</fx:String>
      </fx:Array>
   举例
   <mx:LinkBar  id="navigationBar" dataProvider="{barname}"/>
   <mx:LinkBar  id="navigationBar" dataProvider="barname"/>
   注:写{},则当barname数据的值修改后,linkbar的数据同步更新
2.array在程序中使用
   [Bindable]
   public var barname:Array=["Flex","Flash","Dreamweaver"];
   <mx:LinkBar  id="navigationBar" dataProvider="{barname}"/>
   var barname:Array = new Array();
   barname.push("Flex");
   barname.push("Flash");
   barname.push("Dreamweaver");
   navigationBar.dataProvider = barname;
3.array的排序
   private var temp:Array = new Array(1,4,3,45,4,6,7,77,9);
   function sortArray(numbers:Array):Array{      
      numbers.sort(Array.NUMERIC);
      return numbers;
   }
4.ArrayCollection特点
   ArrayCollection是flex中的数组集合类,它是很常用的,我们使用它时需要注意几个地方
(1)事件监听
    ArrayCollection可以为它注册一个集合改变的监听事件(CollectionEvent.COLLECTION_CHANGE),就是一旦 ArrayCollection数组改变就会触发Event,不是所有情况的改变都会触发改变事件,如果集合当中的对象属性没有被绑定,那么你改变它的对象值也是不会触发事件的,在这种情况下你也许可能需要去将对象的属性进行绑定或者通过itemUpdated方法去管理对象值改变,除非集合的长度改变了,事件才会被触发
(2)对象删除
    ArrayCollection的对象删除方法removeAll(),有这样一种情况,当你在过滤集合数据的时候,它并不会删除所有数据,而是删除全部过滤的数据,不符合过滤条件的数据就没被删除,依然还在source中
(3)过滤函数
    ArrayCollection有个filterFunction过滤函数,就是可能集合中你只需要显示其中某几个对象,你将会需要根据对象条件筛选对象,那么你可能会用过滤函数,过滤函数会将不符合条件的对象过滤出来,但是ArrayCollection有个source属性是不会变的,它是个数组,所有源数据全在里面,尽管你去过滤,所有对象都会一直存在其中
(4)排序
    ArrayCollection还有一个sort属性是用来排序的,你可以为其指定排序字段
5.ArrayCollection在程序中使用
(1)插入或删除
   import mx.collections.ArrayCollection;
   private var coll:ArrayCollection;
    coll = new ArrayCollection(
           [{name:"Martin Foo", age:25},
            {name:"Joe Bar", age:15},
            {name:"John Baz", age:23}]);
    }
   要插入元素,可使用addItemAt和addItem:
   coll.addItemAt({name:"James Fez", age:40}, 0);
   coll.addItem({name:"James Fez", age:40});
(2)搜索
   Sort 对象提供findItem 方法用于搜索这个ArrayCollection 中的所有元素。
方法原型如下:
   public function findItem(items:Array, values:Object, mode:String,
returnInsertionIndex:Boolean = false, compareFunction:Function = null):int
   Value 参数可以是包含属性和所需值的任何对象。
   Mode 字符串可以是Sort.ANY_INDEX_MODE,表示返回任何匹配项索引,Sort.FIRST_INDEX_MODE 表示返回第一个匹配项索引,Sort.LAST_INDEX_MODE 表示返回最后一个匹配项索引。
   returnInsertionIndex 参数表示如果该方法找不到由values 参数标识的项目,并且此参数为
true,则findItem() 方法将返回这些值的插入点,也就是排序顺序中应插入此项目的。
   compareFunction 设置用于查找该项目的比较运算符函数.
举例
   private function checkExistence():int { 
      var sort:Sort = new Sort();
      return sort.findItem(coll.source,{name:nameTI.text, age:Number(ageTI.text)},  Sort.ANY_INDEX_MODE);
   }
(3)过滤
   filterFunction 属性是由ListCollectionView 类定义,它是ArrayCollection 的父类。
   当过滤器函数被传递给继承自ListCollectionView 的任何子类后,这里为ArrayCollection 对象,应用过滤器后必须调用refresh 方法
   将原型为function(item:Object):Boolean 的函数传递给ArrayCollection 的filter 属性。如果返回true 表示值继续留在ArrayCollection,返回false 表示其值被移除。
举例:
  private function init():void {
      coll = new ArrayCollection([{name:"Martin Foo", age:25},{name:"Joe Bar", age:15},name:"John Baz", age:23},{name:"Matt Baz", age:21}]);
      coll.filterFunction = filterFunc;
      coll.refresh();
      for(var i:int = 0; i<coll.length; i++) {
          trace(coll.getItemAt(i).name);
      }
   }
   private function filterFunc(value:Object):Object {
      if(Number(value.age) > 21) {
          return true;
      }
      return false;
   }
(4)排序
   首先要创建一个Sort,传递一个SortField 对象数组给fields 属性。这些SortField 对象包含的字符串正是每个ArrayCollection 元素将要用来排序的属性。如要对每个对象的age 属性进行排序,创建Sort 对象,传递SortField。
    设置排序字段为age:
    private function getOldest():void {
       var sort:Sort = new Sort();
       sort.fields = [new SortField("age")];
       coll.sort = sort;
       coll.refresh();
       trace(coll.getItemAt(0).age+" "+coll.getItemAt(0).name);
    }
    先按name升序排序,再按age降序排序
    sort.fields = [new SortField("name"),new SortField("age",true,true)];
API说明:
public function SortField(
          name:String = null,
          caseInsensitive:Boolean = false,
          descending:Boolean = false,
          numeric:Object = null)
参数 
    name:String (default = null) — 此字段用来进行比较的属性的名称。如果该对象为简单类型,则传递 null。
    caseInsensitive:Boolean (default = false) — 在对字符串进行排序时,指示比较运算符是否忽略值的大小写。
    descending:Boolean (default = false) — 指示比较运算符是否按降序排列项目。 
    numeric:Object (default = null) — 指示比较运算符是否按编号而不按字母顺序比较排序项目。
6.Array和ArrayCollection的比较
Array的优点:
   1)Array的性能优于ArrayCollection,从测试结果平均看来,ArrayCollection的效率是随着object的数目呈线性下降的,而Array则是体现了优异的效率,在object增加的情况下,基本上没有太大的变化。所以如果在你需要遍历所有元素的情况下(比如说物理引擎,3D引擎等),Array是不错的选择
     程序见附件1.
   2)后台JavaBean也用的是数组[]
   3)for循环数组似乎比for each  ArrayConllection看起来更“傻瓜化”
   4)给Array数组扩展长度,也可以变通实现,而且代价并不大
ArrayCollection的优点:
   1)ArrayCollection 实现接口 ICollectionView,在 Flex 的类定义内属于[数据集],他提供更强大的检索、过滤、排序、分类、更新监控等功能。类似的类还有 XMLListCollection
   2)用 array 在作为 dataProvider 绑定于 control 之上,就无法获得控件的更新(实际上效果是可以得到更新的),除非控件被重新绘制或者 data provider 被重新指定,而 Collection 则是将 array 的副本存储于 Collection 类的某个对象之中,其特点是 Collection 类本身就具备了确保数据同步的方法,例子如下(取自 adobe 内部工程师 training 示例,稍有改变)
   3)对ArrayCollection中的对象进行增加删除更新操作时ArrayCollection会产生事件,可以通过collectionchange事件监听,所以在图表开发中都用ArrayCollection做数据源,一旦有更新,就会反映在图标上
附件1:
   <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" frameRate="100" layout="vertical" horizontalAlign="center">
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            [Bindable]
            private var ds:ArrayCollection;
            private var array:Array;
            private var ac:ArrayCollection;
            public function loop(loopCount:uint):Object
            {
                array = null;
                ac = null;
                var begin:uint;
                var end:uint;
                var interval1:Number = 0;
                var interval2:Number = 0;
                var interval3:Number = 0;
                var interval4:Number = 0;
                var i:uint;
                // for array, insert to array
                i=0;
                array= new Array();
                begin = getTimer();
                for (i;i<loopCount;i++)
                {
                    array.push({test:"helllo"});
                }
                end = getTimer();
                interval1 =  end - begin;
                t1.text = interval1.toString()+" ms";
                //loop the array
                i=0;
                begin = getTimer();
                for (i;i<array.length;i++)
                {
                    array[i];
                }
                end = getTimer();
                interval3 =  end - begin;
                t3.text = interval3.toString()+" ms";
                /// for ac, insert to array collection
                i=0;
                ac=  new ArrayCollection();
                begin = getTimer();
                for (i;i<loopCount;i++)
                {
                    ac.addItem({test:"helllo"});
                }
                end = getTimer();
                interval2 =  end - begin;
                t2.text = interval2.toString()+ " ms";
                //loop the array collection
                i=0;
                begin = getTimer();
                for (i;i<ac.length;i++)
                {
                    ac.getItemAt(i);
                }
                end = getTimer();
                interval4 =  end - begin;
                t4.text = interval4.toString()+ " ms";
                return {ct:loopCount,
                array_insert:interval1,
                ac_insert:interval2,
                array_loop:interval3,
                ac_loop:interval4
                };
            }
            private function autoLoop():void
            {
                ds=null;
                ds = new ArrayCollection();
                var i:uint=0;
                for (i;i<parseInt(count.text);i+=parseInt(count.text)>100?parseInt(count.text)/10:1)
                {
                    ds.addItem(loop(i));
                }
            }
            public function reset():void
            {
                t1.text ="0";
                t2.text ="0";
                t3.text = "0";
                t4.text = "0";
                count.text = "1000";
                ds=null;
                ds = new ArrayCollection();
            }
        ]]>
    </mx:Script>
    <mx:ApplicationControlBar width="503">
        <mx:Label text="插入条数:" fontSize="12" color="#0B333C" fontWeight="bold"/>
        <mx:TextInput width="98" text="1000" id="count"/>
        <mx:Button id="startBtn0" label="Test" click="autoLoop()"/>
        <mx:VRule height="15"/>
        <mx:Button label="reset" click="reset()"/>
    </mx:ApplicationControlBar>
    <mx:Panel width="500" height="480" layout="horizontal" id="testBed" title="Array 与Array Collection的性能比较" fontSize="11" fontWeight="normal">
        <mx:Canvas width="100%" height="100%" id="main" borderStyle="none" autoLayout="false"  horizontalScrollPolicy="off" fontSize="10">
            <mx:LineChart id="lc" x="8.5" y="133" width="463" height="306"  showDataTips="true" dataProvider="{ds}" >
                <mx:horizontalAxis>
                    <mx:CategoryAxis dataProvider="{ds}" categoryField="ct" title="插入Object数目"/>
                </mx:horizontalAxis>
                <mx:verticalAxis>
                    <mx:LinearAxis id="la" minimum="-1" title="响应时间(毫秒)"/>
                </mx:verticalAxis>
                <mx:series>
                    <mx:LineSeries displayName="array 插入耗时" yField="array_insert" />
                    <mx:LineSeries displayName="arraycollection 插入耗时" yField="ac_insert"/>
                    <mx:LineSeries displayName="array 遍历耗时" yField="array_loop"/>
                    <mx:LineSeries displayName="arraycollection 遍历耗时" yField="ac_loop"/>
                </mx:series>
            </mx:LineChart>
            <mx:HBox x="10" y="0" width="460" height="134" horizontalAlign="left" verticalAlign="middle">
                <mx:Grid horizontalGap="1"  borderThickness="1" borderColor="#C6C6C6"  borderStyle="solid">
                    <mx:GridRow width="100%" height="100%">
                        <mx:GridItem width="86" height="100%">
                            <mx:Label text="毫秒(ms)" fontSize="12"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%" fontSize="12">
                            <mx:Label text="Array"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%" fontSize="12">
                            <mx:Label text="ArrayCollection"/>
                        </mx:GridItem>
                    </mx:GridRow>
                    <mx:GridRow width="100%" height="100%">
                        <mx:GridItem width="66" height="100%">
                            <mx:Label text="插入耗时" fontSize="12"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                            <mx:Text text="0" width="80" id="t1" fontSize="12"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                            <mx:Text text="0" id="t2" width="80" fontSize="12"/>
                        </mx:GridItem>
                    </mx:GridRow>
                    <mx:GridRow width="100%" height="100%">
                        <mx:GridItem width="100%" height="100%">
                            <mx:Label text="遍历耗时" fontSize="12"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%" fontSize="12">
                            <mx:Text text="0" width="80" id="t3"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                            <mx:Text text="0" id="t4" width="80" fontSize="12"/>
                        </mx:GridItem>
                    </mx:GridRow>
                </mx:Grid>
                <mx:VRule height="73" width="3"/>
                <mx:Legend dataProvider="{lc}" width="100%" direction="vertical" fontSize="9" verticalGap="2" fontWeight="normal" fontStyle="normal" fontFamily="Verdana"/>
            </mx:HBox>
        </mx:Canvas>
    </mx:Panel>
    <mx:LinkButton label="beherca" click="navigateToURL(new URLRequest('http://blog.beherca.com'),'_blank')"/>
</mx:Application>
参考文献:
   1.TonyLian. Array 和 ArrayCollection 区别. http://tonylian.javaeye.com/blog/288964
   2.凯文. Array 和ArrayCollection的性能比较. http://blog.beherca.com/logs/45628162.html
   3.xldbk. Flex ArrayCollection几点注意. http://xldbk.javaeye.com/blog/265064
   4.Callan. Flex 集合(ArrayCollection). http://callan.javaeye.com/blog/335551
   5.hugo. Flex的ArrayCollection与Array的排序. http://www.hugo8.com/article.asp?id=744

原文地址 http://blog.chinaunix.net/u/21752/showart_2086023.html

转载于:https://www.cnblogs.com/jiayuan/archive/2010/01/04/1638806.html

Flex的Array和ArrayCollection相关推荐

  1. FLEX Array和ArrayCollection的区别

    当Array的数据发生变化的时候,用它作为数据源的控件不能感知这种变化. 例如:myArray.push("new value"); 这时,如果一个List用它作为dataProv ...

  2. Flex与.NET互操作(十四):FluorineFx的AMF协议通信

    AMF(Action Message Format)在开发Flash/Flex应用中使用频率是非常高的,相对普通的HTTP.WebService的SOAP等多种数据通信方式的效率更高,有人曾经做过这方 ...

  3. Net与Flex入门

    开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF(ActionScript Message Format)协议通信网关,我们可以通过FluorineFx很方便的完成与.N ...

  4. php与flex宝典

    (英文原文: [http://www.adobe.com/devnet/flex/articles/php_getstarted.html Flex quick start guide for PHP ...

  5. python获取当前日期的前一天_【python】datetime获取日期,前一天日期

    1.获取字符串型当前日期 2016-10-09格式 import datetime today = datetime.date.today() #datetime.date类型当前日期 str_tod ...

  6. 数据源改变后,BarChart组件的运动效果.

    showDataEffect属性. barSeries.xField 属性 barSeries.displayName 属性 示例: 代码: <?xml version="1.0&qu ...

  7. 老男孩上海校区Python面试题

    python面试题 第一章:python基础 数据类型: 1 字典: 1.1 现有字典 dict={'a':24,'g':52,'i':12,'k':33}请按字典中的 value 值进行排序? 1. ...

  8. flex array java_Flex中ArrayCollection 与java中的ArrayList互转

    Flex中ArrayCollection与java中的ArrayList互转 这里说这是Flex用remoting传一个ArrayCollection到后台(后台也用ArrayCollection接参 ...

  9. 2020-08-04 html的js位置 + css的flex实现九宫格 + JS的Array + 软技能的硬编码

    2020-08-04 题目来源:http://www.h-camel.com/index.html [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看 html文件 ...

最新文章

  1. python绘制灰度图片直方图-python数字图像处理(9):直方图与均衡化
  2. Java学习day2
  3. [pytorch、学习] - 3.13 丢弃法
  4. Helm 3 完整教程(二):Helm 3 安装教程
  5. 计算机中十类指令寻址方式总结
  6. 视频编码中的PAFF和MBAFF的区别
  7. 彩虹也能“生”出小彩虹
  8. AdGuard自定义拦截规则
  9. Dremel学习总结2
  10. 集体名词做主语时下谓语的单复数选择
  11. 微信小程序 用户登录界面,用户名无法切换输入法问题解决方法
  12. 【从饮水机到名人堂之c语言】操作符详解(1)
  13. 匈牙利命名法(Hungarian Notation)
  14. 计算机二级(五)小笨鸟学飞版
  15. EEG实验后统一两种不同的脑电帽的电极点数据
  16. 对计算机接口提出的新要求吗,2017年秋微机原理与接口技术
  17. 关于SparkHashJoin等值和不等值连接
  18. 什么是“反射”和“内省”?
  19. 说一说室内定位中的一些黑幕
  20. 一个CSDN程序员苦逼的一天又一天——part2

热门文章

  1. path:path在路由中的使用
  2. @staticmethod用法
  3. awk输出最后一列的命令
  4. netbeans工具栏字体太小
  5. 工厂模式---设计模式(二)
  6. 线上服务器登记的要点
  7. 实验二 初始化阶段-source.c
  8. swift_通知的使用
  9. js中的类、继承、闭包
  10. mac更新java失败解决办法