- 浏览: 129324 次
- 性别:
- 来自: 济南
文章分类
最新评论
在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:
Flex中的复制同java一样,也分为深复制和浅复制。(如果您对java的深复制和浅复制理解不深的话,可以参考我前一篇文章:JAVA中浅复制与深复制)
下面总结一下ArrayCollection的浅复制,共有4种方法:
1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);
2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);
3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());
4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());
以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。
有的时候,我们也会用到深复制,方法如下:
var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));
this.clone()方法定义如下:
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
下面是我测试以上程序的Flex程序代码,大家可以参考:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()" layout="absolute"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.collections.ListCollectionView; import mx.controls.Alert; import flash.utils.ByteArray; public function initApp():void { } //开始测试: //浅复制1 private function test1():void { //初始化需要的对象 var obj1:Object=new Object();//定义对象obj1 var obj11:Object=new Object();//定义对象obj1的引用对象obj11 obj1.name="obj1.name"; obj1.sub=obj11;//obj1的sub属性引用obj11 obj11.name="obj11.name"; //实例化ArrayCollection对象,并将obj1添加进该对象 var oldArray:ArrayCollection=new ArrayCollection(); oldArray.addItem(obj1); //浅复制ArrayCollection var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list); //修改obj11.name的值 obj11.name="obj11.name is changed!"; //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制 Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name); } //浅复制2 private function test2():void { //初始化需要的对象 var obj1:Object=new Object();//定义对象obj1 var obj11:Object=new Object();//定义对象obj1的引用对象obj11 obj1.name="obj1.name"; obj1.sub=obj11;//obj1的sub属性引用obj11 obj11.name="obj11.name"; //实例化ArrayCollection对象,并将obj1添加进该对象 var oldArray:ArrayCollection=new ArrayCollection(); oldArray.addItem(obj1); //浅复制ArrayCollection var newArray:ArrayCollection=new ArrayCollection(oldArray.source); //修改obj11.name的值 obj11.name="obj11.name is changed!"; //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制 Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name); } //浅复制3 private function test3():void { //初始化需要的对象 var obj1:Object=new Object();//定义对象obj1 var obj11:Object=new Object();//定义对象obj1的引用对象obj11 obj1.name="obj1.name"; obj1.sub=obj11;//obj1的sub属性引用obj11 obj11.name="obj11.name"; //实例化ArrayCollection对象,并将obj1添加进该对象 var oldArray:ArrayCollection=new ArrayCollection(); oldArray.addItem(obj1); //浅复制ArrayCollection var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice()); //修改obj11.name的值 obj11.name="obj11.name is changed!"; //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制 Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name); } //浅复制4 private function test4():void { //初始化需要的对象 var obj1:Object=new Object();//定义对象obj1 var obj11:Object=new Object();//定义对象obj1的引用对象obj11 obj1.name="obj1.name"; obj1.sub=obj11;//obj1的sub属性引用obj11 obj11.name="obj11.name"; //实例化ArrayCollection对象,并将obj1添加进该对象 var oldArray:ArrayCollection=new ArrayCollection(); oldArray.addItem(obj1); //浅复制ArrayCollection var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray()); //修改obj11.name的值 obj11.name="obj11.name is changed!"; //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制 Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name); } //深复制 private function test5():void { //初始化需要的对象 var obj1:Object=new Object();//定义对象obj1 var obj11:Object=new Object();//定义对象obj1的引用对象obj11 obj1.name="obj1.name"; obj1.sub=obj11;//obj1的sub属性引用obj11 obj11.name="obj11.name"; //实例化ArrayCollection对象,并将obj1添加进该对象 var oldArray:ArrayCollection=new ArrayCollection(); oldArray.addItem(obj1); //浅复制ArrayCollection var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray)); //修改obj11.name的值 obj11.name="obj11.name is changed!"; //输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制 Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name); } //深复制调用的方法 function clone(source:Object):* { var myBA:ByteArray = new ByteArray(); myBA.writeObject(source); myBA.position = 0; return(myBA.readObject()); } ]]> </mx:Script> <mx:Button label="第一种浅复制方法" click="test1()" x="61" y="36"/> <mx:Button label="第二种浅复制方法" click="test2()" y="57" x="61" width="114"/> <mx:Button label="第三种浅复制方法" click="test3()" y="78" x="61" width="114"/> <mx:Button label="第四种浅复制方法" click="test4()" y="98" x="61" width="114"/> <mx:Button label="深复制方法" click="test5()" y="147" x="61"/> </mx:Application>
发表评论
-
Flex:使用@Embed嵌入元素
2010-08-04 16:57 1073可以在Flex应用程序中嵌入各种元素。被嵌入的元素将编译进SW ... -
连续滚动的图片效果
2010-01-25 14:37 1545思路是,把超出视觉范围 ... -
Flex PureMVC实例教程
2009-12-18 00:01 4247摘自: http://blog.csdn.net/ ... -
as3强大的正则表达式:RegExp
2009-12-04 15:20 907摘自: http://www.okp ... -
FLEX 3 新特性 (个人无责任猜想版)
2009-11-07 21:32 905http://www.unbuzz.com/blogs/ind ... -
Flex设置ToolTip样式
2009-10-25 13:33 1303StyleManager.getStyleDeclaratio ... -
Flex-DataGrid使用关键字过滤结果
2009-04-23 17:02 947这里主要展示如何使用搜索的关键字过滤DataGri ... -
你有所不知的HTML发布Flash的参数(一):allowScriptAccess
2009-04-13 10:22 1292摘自: http://www.luar.com.hk/flas ... -
firefox下js与flash通讯的可恶
2009-04-12 16:56 775http://www.laaan.cn/?p=682 -
flex creationComplete事件的一些思考
2009-03-29 21:39 1431creationComplete恐怕是flex ... -
flex初始化时的事件测试
2009-03-29 21:31 857flex组件在建立的时候都会经历四个事件:preinitial ... -
Flex locale ResourceBundle的使用
2009-03-25 15:47 2992ResourceBundle的使用 新建文件夹(Loca ... -
RangeError: Error #2006: 提供的索引超出范围
2009-03-18 11:18 3326如果你使用了PopUpManager.addPopUp添加弹出 ... -
TabNavigator使用心得
2009-03-17 10:58 1819做了一个控件很长时间,一直有两个问题困扰我。 1. ... -
Flex 数据绑定技巧
2009-03-16 21:19 800有一种简单的方法可以 ... -
Flex 程序的初始化顺序
2009-03-16 21:11 825Flex程序执行的过程中会触发 preinitialize, ... -
Application的启动顺序
2009-03-16 21:10 795preloader->systemManager-> ... -
Flex启动过程分析
2009-03-16 21:02 763首先介绍一下SystemManager. SystemMana ... -
Flex的crossdomain.xml问题
2009-03-09 13:04 3486玩过Flex或者Flash的同学都知道,如果想要在Flash里 ... -
FLEX内存优化
2009-03-06 13:17 892FLEX内存释放优化原则: ...
相关推荐
NULL 博文链接:https://xaajie.iteye.com/blog/379054
Flex的Array和ArrayCollection
tree多数情况下操作xml比较方便,而本人却对xml有些排斥,说得更确切些,对xml用的不是那么得心应手,所以选择了ArrayCollection
NULL 博文链接:https://tangdonglai.iteye.com/blog/1478277
Flex的ArrayCollection在某些情况无法绑定解决方法
ArrayCollection求最大值,最小值,排序。供大家共同学习一下。
ArrayCollection添加过滤器后,调用removeItemAt()是无法删除的,下面有个不错的解决方法,大家可以参考下
java-flex-mysql,实现增删改查,用户富客户端Flex,后台java封装list形式,Flex前台ArrayCollection来接受!
Flex 编程小技巧 1. 复制内容到剪贴板 1. System.setClipboard(strContent); 2. 复制一个 ArrayCollection 1. //dummy solution( well, it works ) 2. var bar:ArrayCollection = new ArrayCollection(); 3. for ...
flex通过httpService读取xml数据到datagird中,通过读取远程URL的XML数据(这里保存到本地),保存到ArrayCollection中,然后在将ArrayCollection绑定到datagird上 环境:flex3.0 可直接运行
4.找到fusioncharts文件中FusionChartsFlex\Charts\FlashBuilder4_SWC下面的那个swc文件,将其复制到flex-libs文件夹下: 5.将FusionChartsFlex\Charts下面的FusionCharts和FusionWidgets两个文件夹复制到flex_...
如果你建立的项目不是flex项目,而需要使用ArrayCollection等,请把这个mx包引入解决问题
//fr.data为flex加载excel的byte数组 var sheet:Array = excel.getSheetArray();//得到表格数据,为Array格式 var datasource:ArrayCollection = new ArrayCollection(sheet); //可转换为ArrayCollection,用于表格...
1. Java通过第三方控件POI操作Excel,读取的数据存储在...2. 通过Blazeds将ArrayList发送到Flex中的ArrayCollection中。(Blazeds构建过程不在本篇讨论范围,见flex4+blazeds+java通信(视频)) 3. 绑定到DataGrid。
flex外部读取xml
flex自定义用ArrayCollection做数据源的带checkbox的tree(功能强大的完美版^_^) .
其中包含一个三种状态的checkbox,DataGrid代码中引用了 带多选框的DataGrid(AdvancedDataGrid) 表头有全选CheckBox,三种状态:全选、部分选择、无选择 如果改变目录结构,需要在...目前数据源只能用ArrayCollection
因为new ArrayCollection 需要 array对象,event.result是空间返回对象(JAVA方法返回值)所以类型不同无法使用new 构造ArrayCollection ,可是恶心的FLEX偏偏支持javalist=ArrayCollection
//fr.data为flex加载excel的byte数组 var sheet:Array = excel.getSheetArray();//得到表格数据,为Array格式 var datasource:ArrayCollection = new ArrayCollection(sheet); //可转换为ArrayCollection,用于...
import mx.collections.ArrayCollection; import mx.rpc.events.ResultEvent; [Bindable] private var slides:ArrayCollection private function resultHandler(event:ResultEvent):void ...