Flex中itemRenderer使用(五):效率

如果您要显示大量 itemRenderer-无论在 DataGrid 还是在 AdvancedDataGrid 中-如果无法有效编写这些 itemRenderer, 您的应用程序性能可能受到负面影响。以下是一些可能有所帮助的提示:

•限制使用 itemRenderer 的列数。是否真的需要将每个列作为自定 itemRenderer?有时需要这样, 光芒太强是否会令用户头晕眼花?
•尝试不要过于频繁地更改 itemRenderer 中元素的样式。如果需要切换样式 (例如, 绿色用于正值, 红色用于负值) , 可考虑为这些样式创建两个控制预设并使其中一个可见。更改样式 Flex 中比较费时的任务之一。
•不要将 Containers 用作 itemRenderer 的基础。容器会占用大量资源。少量使用它们, 效果还不错; 但是根据 UIComponent 编写 itemRenderer 效率更高。

以下 itemRenderer 根据数据字段的值切换组件。
Java代码

1. <mx:Canvas>
2. <mx:Script><![CDATA private function lessThanZero() : Boolean {
3. return data.price < 0; }
4. ]]></mx:Script>
5. <mx:Label text="{data.price}" color="#FF0000" visible="{lessThanZero()}" />
6. <mx:Label text="{data.price}" color="#00FF00" visible="{!lessThanZero()}" />
7. </mx:Canvas>

<mx:Canvas>
<mx:Script><![CDATA private function lessThanZero() : Boolean {
return data.price < 0; }
]]></mx:Script>
<mx:Label text="{data.price}" color="#FF0000" visible="{lessThanZero()}" />
<mx:Label text="{data.price}" color="#00FF00" visible="{!lessThanZero()}" />
</mx:Canvas>


这比设置样式要快。要注意的其他事项包括:

•避免数据绑定到样式。更改样式不仅比大多数操作要慢, 而且在它上面添加数据绑定代码只会使它更糟。
•使用 Canvas 或扩展 ListItemRenderer 或作为 itemRenderer 的根。这允许您将控制放在各自上方。

扩展 UIComponent

目前编写 itemRenderer 最有效的方式是使用 ActionScript 类扩展 UIComponent。您可以全面控制代码, 并且渲染器也可以尽可能高效。

从上例切换样式开始, 编写一个扩展 UIComponent 的简单 itemRenderer。
Java代码

1. package renderers
2. {
3. import mx.controls.listClasses.IListItemRenderer;
4. import mx.core.UIComponent;
5.
6. public class PriceItemRenderer extends UIComponent implements IListItemRenderer
7. {
8. public function PriceItemRenderer()
9. {
10. super();
11. }
12. }
13. }

package renderers
{
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;

public class PriceItemRenderer extends UIComponent implements IListItemRenderer
{
public function PriceItemRenderer()
{
super();
}
}
}


您会发现我不仅编写这个类来扩展 UIComponent, 还由它实施 IListItemRenderer 接口。这样做是有必要的, 因为 List 控制将需要任何渲染器实施该接口, 否则您会收到运行时错误, 因为列表尝试将渲染器转换为该接口。

如果阅读 IListItemRenderer 的相关文档, 您会发现这是一个许多其他接口的集合, UIComponent 会为您实施其中的大多数。但有一个 IListItemRenderer 扩展的接口是 UIComponent 不实施的:IDataRenderer。这需要您添加代码, 为 itemRenderer 类提供您一直使用的 data 属性。

如果您尝试不实施 IDataRenderer 就使用这个类, 则编译代码时会收到以下错误:

•1044:类 renderers:PriceItemRenderer 未实施名称空间 mx.core:IDataRenderer 中的接口方法 get data。
编辑这个类并将它更改为以下内容:

Java代码

1. package renderers
2. {
3. import mx.controls.listClasses.IListItemRenderer;
4. import mx.core.UIComponent;
5. import mx.events.FlexEvent;
6.
7.
8. public class PriceItemRenderer extends UIComponent implements IListItemRenderer
9. {
10. public function PriceItemRenderer()
11. {
12. super();
13. }
14.
15. // Internal variable for the property value.
16.
17. private var _data:Object;
18. // Make the data property bindable.
19.
20. [Bindable("dataChange")]
21. // Define the getter method.
22.
23. public function get data():Object {
24.
25. return _data;
26.
27. }
28. // Define the setter method, and dispatch an event when the property
29.
30. // changes to support data binding.
31.
32. public function set data(value:Object):void {
33.
34. _data = value;
35.
36. dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
37.
38. }
39. }
40. }

package renderers
{
import mx.controls.listClasses.IListItemRenderer;
import mx.core.UIComponent;
import mx.events.FlexEvent;


public class PriceItemRenderer extends UIComponent implements IListItemRenderer
{
public function PriceItemRenderer()
{
super();
}

// Internal variable for the property value.

private var _data:Object;
// Make the data property bindable.

[Bindable("dataChange")]
// Define the getter method.

public function get data():Object {

return _data;

}
// Define the setter method, and dispatch an event when the property

// changes to support data binding.

public function set data(value:Object):void {

_data = value;

dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));

}
}
}


我直接使用 IDataRenderer 的 Flex 文档中的代码, 这样您都不用自己键入它。

移除它后, 您可以加入两个标签。

1.添加变量用于存放这两个标签。

private var posLabel:Label; private var negLabel:Label;
2.将 set data 函数修改为调用 invalidateProperties()。这很重要, 因为更改数据必须更改标签中的文本以及它们的可视性。

Java代码

1. public function set data(value:Object):void {
2. _data = value;
3. invalidateProperties();
4. dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
5. }

public function set data(value:Object):void {
_data = value;
invalidateProperties();
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
}


调用 invalidateProperties() 会告知 Flex 框架在适当的时间调用 commitProperties() 函数。

3.覆盖 createChildren() 并创建标签, 添加它们以显示组件列表。注意, 除了创建标签外, 还会设置它们的样式和 visible 属性。
Java代码

1. override protected function createChildren() : void
2. {
3. super.createChildren();
4. posLabel = new Label();
5. posLabel.visible = false;
6. posLabel.setStyle("color", 0×00FF00);
7. addChild(posLabel);
8. negLabel = new Label();
9. negLabel.visible = false;
10. negLabel.setStyle("color", 0xFF0000);
11. addChild(negLabel);
12. }

override protected function createChildren() : void
{
super.createChildren();
posLabel = new Label();
posLabel.visible = false;
posLabel.setStyle("color", 0×00FF00);
addChild(posLabel);
negLabel = new Label();
negLabel.visible = false;
negLabel.setStyle("color", 0xFF0000);
addChild(negLabel);
}


4.覆盖 commitProperties() 以设置标签的文本和可视性。过去, 您一直通过覆盖 set data 进行这类更改, 如果您喜欢, 也可以在这个类中那样做。

Java代码

1. override protected
2. function commitProperties():void
3. {
4. super.commitProperties();
5. posLabel.text = data.price;
6. negLabel.text = data.price;
7. posLabel.visible = Number(data.price) > 0;
8. negLabel.visible = Number(data.price) < 0;
9. }

override protected
function commitProperties():void
{
super.commitProperties();
posLabel.text = data.price;
negLabel.text = data.price;
posLabel.visible = Number(data.price) > 0;
negLabel.visible = Number(data.price) < 0;
}


5.覆盖 updateDisplayList() 以设置标签大小并进行定位。您必须设置标签大小, 因为它们的默认大小为 0×0。这是 Container 类将为您做的另一件事。由于这个 itemRenderer 十分简单, 您只需将标签大小设置为与 itemRenderer 大小匹配即可。

Java代码

1. override protected function updateDisplayList(
2. unscaledWidth:Number, unscaledHeight:Number ) : void
3. {
4. super.updateDisplayList(unscaledWidth, unscaledHeight);
5. posLabel.move(0,0);
6. posLabel.setActualSize(unscaledWidth,unscaledHeight);
7. negLabel.move(0,0);
8. negLabel.setActualSize(unscaledWidth, unscaledHeight);
9. }

override protected function updateDisplayList(
unscaledWidth:Number, unscaledHeight:Number ) : void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
posLabel.move(0,0);
posLabel.setActualSize(unscaledWidth,unscaledHeight);
negLabel.move(0,0);
negLabel.setActualSize(unscaledWidth, unscaledHeight);
}


所有这些只能做到这点似乎有点复杂, 但是请记住一点, 使用容器增加的代码要比这多得多。


UIComponent 类是所有可视 Flex 组件 (控制和容器) 的基础。以下是将 UIComponent 用作 itemRenderer 的一些相关提示。

•UIComponent 对其子代 (如 Container) 没有版面限制。您必须自己进行子代定位并调整大小。
•还可以超出 updateDisplayList() 中指定的大小绘制图形和位置子代。
•如果准备在列表中使用 variableRowHeight, 您还应覆盖 measure() 函数, 告知列表 itemRenderer 有多大。
•要将 UIComponent 用作 itemRenderer, 您必须实施 IDataRenderer。
•要使用 listData 属性, 您必须实施 IDropInListItemRenderer; 本系列之前的文章中讨论过这个操作。
数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值