`
wkkyo
  • 浏览: 30831 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Flex中List组件拖动后错位的解决方法

    博客分类:
  • Flex
 
阅读更多

在List中使用了ItemRenderer组件,结果在拖动的过程中老是出现错位的问题,这个问题困扰了我半天,google了好多资料,终于找到一个比较好的解决方案,特转过来分享给大家

使用Flex的组件时,大伙不可避免要和itemRenderer打交道。Flex组件中,支持自定义itemRenderer功能的组件不少,常见的有List,TileList,ComboBox,Tree,DataGrid等。这类组件具有一个共性:显示一组数据,并具备交互功能。

在使用这些组件时,我们只需要把数据按照一定的格式组织好,然后赋予给组件作为dataProvider,剩下的事就由组件来完成。处于需要,有时候我们需要个性化数据的显示方式,比如List组件,默认的itemRenderer是一个类似Label的元件,只显示每一条数据中的固定字段,如果想要显示更多信息,就必须自定义一个itemRenderer。

itemRenderer的实现原理

itemRenderer的实现依赖于 AS3的一个重要特性:反射。反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式,比如实现动态创建类实例、方法等。示例如下:

import flash.utils.getQualifiedClassName;var cls:Class = flash.display.MovieClip;var mc:MovieClip = new cls();</p>
<p>trace(getQualifiedClassName(mc));</p>
<p>//输出:flash.display::MovieClip

itemRenderer的本质是Class类型,组件获取数据后,动态生成itemRenderer的实例。

itemRenderer 的特点 可以被当作 itemRenderer的组件,都实现了mx.core.IDataRenderer接口或mx.controls.listClasses.IListItemRenderer接口,还有mx.core.listClasses.IDropInListItemRenderer接口,用来实现有下拉框组件的itemRenderer。

不管怎样,组件都有data属性,这是一个存取器性质的函数。 这个函数很有用。

itemRenderer的工作方式 首先要明白一点,组件并不是很简单地把数据一次显示。为了提高运行效率,组件在处理数据时,只是创建了适当数量的itemRenderer,来完成显示区域的数据显示,这样,当数据源的数据量很大时,也不会耗费系统的资源。而且,itemRenderer是根据需要创建,创建后又是反复使用,很绿色,很环保。当显示区域发生变化或者拉动滚动条时,组件只是更新itemRenderer的数据。

比如,TileList、List组件,如果数据源只有一条数据,显示区域可以同时显示十条,则开始时只创建一个itemRenderer,添加一条数据,再创建一个新的itemRenderer。当数据量超过显示区域的最大值10时,就不再创建新的itemRenderer,而是回收利用现有资源。

另外,TileList、List还会创建一个多余的 itemRenderer,用来检测itemRenderer的尺寸等,方便定位。

虽然itemRenderer是真正的环保战士,但如果我们使用不当,就会出现很多奇怪的现象,比如内存泄露就是一个很常见的问题。在Adobe官方的论坛上,就经常见到这类讨论。其实,理解了itemRenderer的动作原理,这些问题就不难找到解决方法。

自定义itemRenderer是个强大的功能,但如果使用不当,就会出现很多奇怪的现象,比如内存泄露就是一个很常见的问题。

常见的两种问题: 1.在自定义itemRenderer中使用creationComplete事件来处理数据 有些朋友习惯在组件中把初始化处理都写在creationComplete事件处理函数中,一般情况下,这没有问题,然而在自定义itemRendere,却不合适。 因为itemRenderer是循环使用的,也就是说,itemRendere在第一次创建后,可能用来显示不同的数据,而本身只被创建一次,creationComplete事件只发生一次,自然就会出问题。 这个问题很常见,可能引发很多奇怪的现象,比如对象无法被清除,资源释放不完全,内存泄露等等。 那如何避免?我们可以覆盖data存取器的setter方法,比如:

override public function set data(value:Object):void{
	//加上自己的代码
}

2.删除数据后系统资源仍被占用 在解决了第一个问题后,还是有可能出现资源无法正确释放的问题。比如TileList组件可显示40条数据,每一条数据都包括一张位图。当删除数据,从50减少4时,会发现显示的数目确实减少了,但系统消耗的资源却不变。数据量越大,这个现象就越明显。 问题出在哪里?根据现象,从逻辑上推测:数据量减少,也就是已有的itemRenderer实例被“删除”的时候,并没有释放资源。 这就是问题所在,已有的itemRenderer并不会被删除,一旦创建就一直存在,所谓的“删除”,仅仅是将它变为不可见,而占有的资源不会自动释放,如果其中包括了位图、声音、动画,将一直存在,成为系统资源杀手。 我提供的解决方法:监听itemRenderer的hide事件,在变为不可见的同时,手动释放资源。也许有其它更好的方法,就等着你去发现了

分享到:
评论
1 楼 路人丁11 2011-10-20  
我找ItemRenderer的定义可找了两天,3q

相关推荐

    支持手动拖拽缩放flex组件的组件

    在给定的标题“支持手动拖拽缩放flex组件的组件”中,我们可以推断出这是一个专门针对Flex环境设计的组件,它允许用户通过手动拖拽和缩放操作来调整Flex应用中的组件大小。 描述中提到的“com.janisRadins.zip”很...

    flex组件LIST使用

    在Flex框架中,`List`组件是用于展示和操作数据集的一个强大工具。根据给定的文件信息,我们可以深入探讨如何在Flex应用中使用`List`组件,以及如何结合脚本进行动态数据处理。 ### 标题:Flex组件LIST使用 #### ...

    flex组件拖拽框架

    Flex组件拖拽框架是一种在Adobe Flex环境中实现的交互设计技术,允许用户通过鼠标操作将组件在界面上自由移动,从而提升用户体验和应用的可操作性。这个框架通常由一系列类和方法组成,用于处理拖放事件,跟踪鼠标...

    flex 高级自定义组件

    Flex中的高级自定义组件开发是构建复杂用户界面的关键技术,它允许开发者超越基本组件的限制,以满足特定的业务需求和视觉设计。在创建高级组件时,了解并掌握一些核心方法的重写至关重要,这些方法涉及到组件的生命...

    Flex各自定义组件事件通讯例子

    在Flex开发中,自定义组件和事件通讯是构建复杂应用程序的关键技术。本示例通过一个简单的用户登录场景,深入解析了如何实现组件间的有效通信。下面将详细解释Flex自定义组件、事件处理以及它们在实际应用中的作用。...

    Flex4自定义组件开发.pdf

    在Flex4中,自定义组件的开发变得尤为重要,因为它允许开发者创建高度定制化的UI组件,以满足特定的应用需求。 #### 二、Spark组件架构剖析 Flex4采用了全新的Spark组件架构,与之前的Flex3(Halo组件架构)相比有...

    Flex中组件datagrid导出Excel

    3. **XML序列化**:在Flex中,我们可以利用XML或XMLList来表示数据,因为它们可以轻松地转换成字符串,方便写入文件。将DataGrid的数据转换成XML,可以采用循环遍历的方式,将每行数据转换成一个XML节点,然后将所有...

    Adobe Flex Builder 3组件之间的传递参数

    在Adobe Flex Builder 3中,开发富互联网应用程序(RIA)时,经常需要在不同组件之间交换数据或参数。这是构建动态、交互式用户界面的关键环节。本教程将深入探讨Flex中组件之间的参数传递机制,帮助你更好地理解和...

    Flex 4.5 实现tree拖拽到任意组建

    本教程将详细介绍如何在Flex 4.5中实现Tree组件与任意组件之间的拖放操作,特别是将树形结构的数据拖拽到DataGrid中,并获取目标位置的全部数据进行添加。 1. **Flex 4.5的DragManager和DropTarget** Flex 4.5中的...

    Flex 分页组件,flex自定义组件

    在Flex中,分页组件通常是自定义组件,因为Flex的标准库并未提供内置的分页解决方案。开发者通常需要根据实际需求来设计和实现这样的组件。以下是对Flex分页组件的详细解释: 1. **分页机制**:分页的核心是将大...

    flex中的组件重写例子

    在Flex开发中,组件重写是一项关键技能,它允许开发者根据特定需求定制标准组件,以实现更高效、更具个性化的用户界面。本文将深入探讨Flex组件重写的原因、注意事项、重写过程以及组件的内部执行流程,并通过示例...

    Flex3+组件拖放教程

    在Flex3中,组件的拖放功能是一项核心特性,它允许用户轻松地通过鼠标操作将一个对象从一处拖动到另一处,从而实现数据的移动或者功能的交互。 拖放功能在Flex3中的实现主要依赖于两个主要类:`DragManager` 和 `...

    Flex 组件Flex 组件Flex 组件

    在Flex组件的开发过程中,开发者还需要了解ActionScript,这是Flex的主要编程语言,基于ECMAScript,用于编写组件的行为逻辑。同时,MXML是一种声明式语言,常用来定义组件的结构和外观,与ActionScript结合使用,...

    Flex 自定义组件ImageViewer

    3. **commitProperties()**: 在属性更改后,Flex会调用此方法来更新组件的状态。如果你的组件有一些依赖于其他属性的属性,例如ImageViewer的缩放因子取决于某个属性,那么在这个方法中处理这些变化。 4. **...

    flex 拖拽功能 中文文档

    Flex中的单个组件不仅可以充当拖动发起者,还可以成为拖放目标,这意味着可以在同一个组件内部移动数据。例如,`List`控件可以同时作为拖动发起者和拖放目标,实现列表项的重新排序。 #### 基于列表控件的拖放应用 ...

    FLEX_List).rar_flex_flex list_flex li_flex lis_flex list

    在Flex中,`List`是显示可滚动项目列表的标准组件。它可以用来展示大量数据,并通过数据提供者(DataProvider)与数据模型绑定,实现数据的动态更新。在`FLEXList`项目中,描述中的"list展示"可能指的是一个定制化的...

    flex4自定义组件皮肤

    - 组件皮肤是Flex中改变组件外观的一种方式,通过定义不同的皮肤,可以改变组件的颜色、形状、边框等视觉元素。 - Flex4引入了Spark组件模型,相对于MX组件,Spark组件更加强调可定制性,允许开发者更自由地设计...

    flex3自定义组件之间的拖拽事件处理

    因为工作原因和个人兴趣原因,刚接触flex,遇到不少问题,这次花了一个早上的时间专门研究了一下组件件的拖拽,呵呵,还是很有成就感的。

    Flex 保存组件至本地

    Flex提供了`flash.display.BitmapData`类,可以通过`draw()`方法将任何可视对象(包括Flex组件)绘制到位图数据中。 2. **捕获组件的视觉表示** 要获取组件的视觉表示,可以创建一个`BitmapData`对象,然后调用其`...

    Flex4的组件信息

    详解Flex4的系统组件与基本组件。让你在应用的时候知道用什么.

Global site tag (gtag.js) - Google Analytics