Flex Array和Flex ArrayCollection的用法和區(qū)別
本文和大家重點討論一下Flex Array和Flex ArrayCollection的用法和區(qū)別,這里從六個方面向大家介紹,相信通過本文的學習你對二者之間的聯(lián)系會有明確的認識。
Flex Array和Flex ArrayCollection的用法和區(qū)別
1.Flex Array作為控件使用
FLEX3寫法:
- <mx:Flex Arrayidmx:Flex Arrayid=”barname”>
- <mx:String>Flash</mx:String>
- <mx:String>Director</mx:String>
- <mx:String>Dreamweaver</mx:String>
- <mx:String>ColdFusion</mx:String>
- </mx:FlexArray>
FLEX4寫法:
- <fx:Flex Arrayidfx:Flex Arrayid=”barname”>
- <fx:String>Flex</fx:String>
- <fx:String>Flash</fx:String>
- <fx:String>Dreamweaver</fx:String>
- </fx:FlexArray>
舉例
<mx:LinkBarid=”navigationBar”dataProvider=”{barname}”/>
<mx:LinkBarid=”navigationBar”dataProvider=”barname”/>
注:寫{},則當barname數(shù)據(jù)的值修改后,linkbar的數(shù)據(jù)同步更新
2.Flex Array在程序中使用
- [Bindable]
- publicvarbarname:FlexArray=["Flex","Flash","Dreamweaver"];
- <mx:LinkBaridmx:LinkBarid=”navigationBar”dataProvider=”{barname}”/>
- varbarname:FlexArray=newFlexArray();
- barname.push(“Flex”);
- barname.push(“Flash”);
- barname.push(“Dreamweaver”);
- navigationBar.dataProvider=barname;
3.Flex Array的排序
- privatevartemp:FlexArray=newFlexArray(1,4,3,45,4,6,7,77,9);
- functionsortFlex Array(numbers:Flex Array):Flex Array{
- numbers.sort(Flex Array.NUMERIC);
- returnnumbers;
- }
4.Flex ArrayCollection特點
Flex ArrayCollection是flex中的數(shù)組集合類,它是很常用的,我們使用它時需要注意幾個地方。
(1)事件監(jiān)聽
Flex ArrayCollection可以為它注冊一個集合改變的監(jiān)聽事件(CollectionEvent.COLLECTION_CHANGE),就是一旦Flex ArrayCollection數(shù)組改變就會觸發(fā)Event,不是所有情況的改變都會觸發(fā)改變事件,如果集合當中的對象屬性沒有被綁定,那么你改變它的對象值也是不會觸發(fā)事件的,在這種情況下你也許可能需要去將對象的屬性進行綁定或者通過itemUpdated方法去管理對象值改變,除非集合的長度改變了,事件才會被觸發(fā)。
(2)對象刪除
Flex ArrayCollection的對象刪除方法removeAll(),有這樣一種情況,當你在過濾集合數(shù)據(jù)的時候,它并不會刪除所有數(shù)據(jù),而是刪除全部過濾的數(shù)據(jù),不符合過濾條件的數(shù)據(jù)就沒被刪除,依然還在source中。
(3)過濾函數(shù)
Flex ArrayCollection有個filterFunction過濾函數(shù),就是可能集合中你只需要顯示其中某幾個對象,你將會需要根據(jù)對象條件篩選對象,那么你可能會用過濾函數(shù),過濾函數(shù)會將不符合條件的對象過濾出來,但是Flex ArrayCollection有個source屬性是不會變的,它是個數(shù)組,所有源數(shù)據(jù)全在里面,盡管你去過濾,所有對象都會一直存在其中。
(4)排序
Flex ArrayCollection還有一個sort屬性是用來排序的,你可以為其指定排序字段。
5.ArrayCollection在程序中使用
(1)插入或刪除
- importmx.collections.Flex ArrayCollection;
- privatevarcoll:Flex ArrayCollection;
- coll=newFlex ArrayCollection(
- [{name:"MartinFoo",age:25},
- {name:"JoeBar",age:15},
- {name:"JohnBaz",age:23}]);
- }
要插入元素,可使用addItemAt和addItem:
coll.addItemAt({name:”JamesFez”,age:40},0);
coll.addItem({name:”JamesFez”,age:40});
(2)搜索
Sort對象提供findItem方法用于搜索這個Flex ArrayCollection中的所有元素。
方法原型如下:
publicfunctionfindItem(items:Flex Array,values:Object,mode:String,
returnInsertionIndex:Boolean=false,compareFunction:Function=null):int
Value參數(shù)可以是包含屬性和所需值的任何對象。
Mode字符串可以是Sort.ANY_INDEX_MODE,表示返回任何匹配項索引,Sort.FIRST_INDEX_MODE表示返回第一個匹配項索引,Sort.LAST_INDEX_MODE表示返回最后一個匹配項索引。
returnInsertionIndex參數(shù)表示如果該方法找不到由values參數(shù)標識的項目,并且此參數(shù)為
true,則findItem()方法將返回這些值的插入點,也就是排序順序中應(yīng)插入此項目的。
compareFunction設(shè)置用于查找該項目的比較運算符函數(shù).
舉例
- privatefunctioncheckExistence():int{
- varsort:Sort=newSort();
- returnsort.findItem(coll.source,{name:nameTI.text,age:Number(ageTI.text)},Sort.ANY_INDEX_MODE);
- }
(3)過濾
filterFunction屬性是由ListCollectionView類定義,它是Flex ArrayCollection的父類。
當過濾器函數(shù)被傳遞給繼承自ListCollectionView的任何子類后,這里為Flex ArrayCollection對象,應(yīng)用過濾器后必須調(diào)用refresh方法
將原型為function(item:Object):Boolean的函數(shù)傳遞給Flex ArrayCollection的filter屬性。如果返回true表示值繼續(xù)留在Flex ArrayCollection,返回false表示其值被移除。
(4)排序
首先要創(chuàng)建一個Sort,傳遞一個SortField對象數(shù)組給fields屬性。這些SortField對象包含的字符串正是每個Flex ArrayCollection元素將要用來排序的屬性。如要對每個對象的age屬性進行排序,創(chuàng)建Sort對象,傳遞SortField。
設(shè)置排序字段為age:
- privatefunctiongetOldest():void{
- varsort:Sort=newSort();
- sort.fields=[newSortField("age")];
- coll.sort=sort;
- coll.refresh();
- trace(coll.getItemAt(0).age+”“+coll.getItemAt(0).name);
- }
先按name升序排序,再按age降序排序
sort.fields=[newSortField("name"),newSortField("age",true,true)];
API說明:
publicfunctionSortField(
name:String=null,
caseInsensitive:Boolean=false,
descending:Boolean=false,
numeric:Object=null)
參數(shù)
name:String(default=null)—此字段用來進行比較的屬性的名稱。如果該對象為簡單類型,則傳遞null。
caseInsensitive:Boolean(default=false)—在對字符串進行排序時,指示比較運算符是否忽略值的大小寫。
descending:Boolean(default=false)—指示比較運算符是否按降序排列項目。
numeric:Object(default=null)—指示比較運算符是否按編號而不按字母順序比較排序項目。
6.Flex Array和ArrayCollection的比較
Flex Array的優(yōu)點:
1)Flex Array的性能優(yōu)于Flex ArrayCollection,從測試結(jié)果平均看來,F(xiàn)lex ArrayCollection的效率是隨著object的數(shù)目呈線性下降的,而Flex Array則是體現(xiàn)了優(yōu)異的效率,在object增加的情況下,基本上沒有太大的變化。所以如果在你需要遍歷所有元素的情況下(比如說物理引擎,3D引擎等),F(xiàn)lex Array是不錯的選擇
程序見附件1.
2)后臺JavaBean也用的是數(shù)組[]
3)for循環(huán)數(shù)組似乎比foreachFlex ArrayConllection看起來更“傻瓜化”
4)給Flex Array數(shù)組擴展長度,也可以變通實現(xiàn),而且代價并不大
ArrayCollection的優(yōu)點:
1)Flex ArrayCollection實現(xiàn)接口ICollectionView,在Flex的類定義內(nèi)屬于[數(shù)據(jù)集],他提供更強大的檢索、過濾、排序、分類、更新監(jiān)控等功能。類似的類還有XMLListCollection
2)用Flex Array在作為dataProvider綁定于control之上,就無法獲得控件的更新(實際上效果是可以得到更新的),除非控件被重新繪制或者dataprovider被重新指定,而Collection則是將Flex Array的副本存儲于Collection類的某個對象之中,其特點是Collection類本身就具備了確保數(shù)據(jù)同步的方法,例子如下(取自adobe內(nèi)部工程師training示例,稍有改變)
3)對Flex ArrayCollection中的對象進行增加刪除更新操作時Flex ArrayCollection會產(chǎn)生事件,可以通過collectionchange事件監(jiān)聽,所以在圖表開發(fā)中都用Flex ArrayCollection做數(shù)據(jù)源,一旦有更新,就會反映在圖標上
【編輯推薦】
- 解析FlexSDK4的十大變化
- Flex必須了解的那些事
- 在Flex中使用樣式的五大方法
- FlexBuilder3.0與Eclipse3.4的完美結(jié)合
- Flex ComboBox和Datagrid組件用法指導