Flex Array 與 ArrayCollection.轉自網絡

1.array做爲控件使用數組

   FLEX3寫法:ide

      <mx:Array id="barname">函數

          <mx:String>Flash</mx:String>性能

          <mx:String>Director</mx:String>測試

          <mx:String>Dreamweaver</mx:String>flex

          <mx:String>ColdFusion</mx:String>spa

      </mx:Array>xml

   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特色

   ArrayCollectionflex中的數組集合類,它是很經常使用的,咱們使用它時須要注意幾個地方

(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}]); 

    }

   要插入元素,可以使用addItemAtaddItem 

   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("age"),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.ArrayArrayCollection的比較

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作數據源,一旦有更新,就會反映在圖標上

相關文章
相關標籤/搜索