ItemRender---之使用ClassFactory生成渲染器

问题
你想在运行时修改List或DataGridColumn的渲染器,或改变渲染器的属性。

解决方案

使用ClassFactory对象作为Itemrenderer。ClassFactory实现了IFactory接口,你只要传一个类对象(即Class类型的对象)给它,它就可以生成这个类的对象。

 

讨论

 这种解决办法,使用了工厂设计模式,并且使用了flex的一些内部机制。在使用工厂模式时,你需要指定一个类型给工厂,这个类型的对象会被工厂类产生并作为渲染器使用,并且工厂类可以控制渲染器的生命周期。那么我们如何把类型指定给工厂类呢?我们需要传一个类对象给工厂类,正如下边的代码。

var factory:ClassFactory = new ClassFactory(oreilly.cookbook.SevenTwoFactor );

 

在这里原文提到了 SevenTwoFactor继承IFactory接口等等,大家需要多了解一些ClassFactory的相关知识,在实际操作中,我们一般都是创建ClassFactory的实例赋值itemRenderer。因为set itemRenderer方法需要的参数是IFactory类型,系统最终会用这个factory对象实例我们的itemRenderer。也就是说,我们给系统的不是一个itemRenderer而是一个能产生itemRenderer的factory,在系统需要时自己用factory产生itemRenderer的实例,也许信息的读者会发现,当我们写mxml的时候,itemRenderer的属性可以赋值一个类路径,这就是因为flex对mxml里的itemRenderer做了一些特殊的功能,如果你传的是一个类路径,系统会帮你创建一个ClassFactory。

例子:

DynamicRenderer 

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" > <mx:Script> <!--[CDATA[ public function changeRenderer():void{ if(btnChange.label == "change to big"){ list.itemRenderer = new ClassFactory(customItemrenderer.BigIconRenderer); //这里正如我上边所说,这里只需要传一个普通类就可以了,但实际开发中我们这里一般都传一个自定义组件,或类似的东西。 btnChange.label = "change to small"; }else{ var cf:ClassFactory = new ClassFactory(customItemrenderer.SmallIconRenderer); //在下边的代码中我实例大家如何利用ClassFactory的properties属性给新产生的对象赋值。 //cf.properties={xx:"heihei"}; var o:Object = new Object(); o.xx = "xixi"; cf.properties = o; //上边的写法,和上边注释掉的写法都是可以的,但我觉得更负责的写法是: //if(cf.properties == null){ // cf.properties = new Object(); // } // o.xx = "hehe"; // list.itemRenderer = cf; btnChange.label = "change to big"; var c:Class = customItemrenderer.BigIconRenderer; var x:Object = new c(); } } ]]--> </mx:Script> <mx:List id="list" width="300" height="300" itemRenderer="customItemrenderer.SmallIconRenderer" variableRowHeight="true"> <mx:dataProvider> <mx:Object label="this is item a" /> <mx:Object label="this is item b" /> <mx:Object label="this is item c" /> <mx:Object label="this is item d" /> </mx:dataProvider> </mx:List> <mx:Button id="btnChange" label="change to big" click="changeRenderer()" x="308" y="10"/> </mx:Application>  

SmallIconRenderer 

<?xml version="1.0" encoding="utf-8"?> <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <!--[CDATA[ public var item:Object = new Object(); public var xx:String; ]]--> </mx:Script> <mx:Label text="{data.label}"/> <mx:Text text="小" /> <mx:Button label="{xx}" /> </mx:HBox>  

BigIconRenderer

<?xml version="1.0" encoding="utf-8"?> <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <!--[CDATA[ public var item:Object = new Object(); ]]--> </mx:Script> <mx:Label text="{data.label}" fontSize="20" fontWeight="bold" color="0xff0000"/> <mx:Text text="大" /> </mx:HBox>  

你可能感兴趣的:(ItemRender---之使用ClassFactory生成渲染器)