Apache flex Flex列表项渲染器
我已经在flex中创建了一个项目列表,但我想在列表中添加新行时调用一个函数,而不是之后。我在渲染列表中得到一个数据对象,在其中我得到要在列表中显示的数据类型,即文本或图像。在列表中添加新数据时,我希望在呈现列表中调用一个函数,该函数检查接收到的数据类型,然后创建并添加一个图像元素或文本元素。所以主要的问题是如何得到一个函数,这个函数在添加数据时被调用。我尝试过datachange和Add之类的事件,但当我们滚动列表时,它们会一遍又一遍地调用函数,但我希望函数只在添加数据时调用一次,而不是在添加数据之后调用一次。下面是渲染器列表代码,也许您会更好地了解我要做的事情:Apache flex Flex列表项渲染器,apache-flex,actionscript,renderer,Apache Flex,Actionscript,Renderer,我已经在flex中创建了一个项目列表,但我想在列表中添加新行时调用一个函数,而不是之后。我在渲染列表中得到一个数据对象,在其中我得到要在列表中显示的数据类型,即文本或图像。在列表中添加新数据时,我希望在呈现列表中调用一个函数,该函数检查接收到的数据类型,然后创建并添加一个图像元素或文本元素。所以主要的问题是如何得到一个函数,这个函数在添加数据时被调用。我尝试过datachange和Add之类的事件,但当我们滚动列表时,它们会一遍又一遍地调用函数,但我希望函数只在添加数据时调用一次,而不是在添加数
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
autoDrawBackground="true" dataChange="test_add()">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
public function test_add() : void {
Alert.show("type="+data.msg_type);
if(data.msg_type=="text"){
//code to create and add new text element to list_row//
}
if(data.msg_type=="image"){
//code to create and add new image element to list_row//
}
}
]]>
</fx:Script>
<s:Group id="list_row" width="100%" verticalAlign="middle" verticalCenter="0">
</s:Group>
</s:ItemRenderer>
我们将非常感谢您的帮助。
谢谢从您展示的代码中我可以看出,解决问题的最简单方法是使用两个独立的ItemRenderer:一个渲染文本,另一个渲染图像。您可以使用属性而不是
itemRenderer
来执行此操作
包含新属性的列表:
<s:List id="myList" dataProvider="{dp}"
itemRendererFunction="getItemRenderer" />
在这两个不同的ItemRenders中,您可以根据需要显示数据
编辑:为什么每次滚动时都会触发
dataChange
事件
事实上,正如您所描述的,您的方法没有任何错误,尽管我认为itemrrenderfunction
方法允许更好地分离关注点。我可以告诉您,只需将属性设置为false
,就可以关闭不需要的行为
<s:List id="myList" dataProvider="{dp}"
itemRenderer="myItemRenderer" useVirtualLayout="false" />
虽然这会满足您的要求(即只创建一次ItemRenders),但这不是一个好建议。默认情况下,此属性设置为true
,这是有充分理由的
使用虚拟布局时,项目渲染器仅在需要时创建,即当它们进入视图并需要向用户显示时。这允许您加载数千个项目,而不会造成性能损失
假设您加载了1000个值对象:这不会占用太多内存或CPU。但现在您需要渲染它们。如果您不使用虚拟布局,则会为所有项目预先创建一个项目渲染器,这意味着数千个图形元素和数千个事件侦听器(具体数量取决于您的设置)。现在,这将损害速度较慢的计算机的性能
如果您只使用虚拟布局,那么一次将创建10个项目渲染器。如果用户向下滚动,将创建下一个10,并删除刚刚从视图中消失的部分,最终进行垃圾收集。所以你看:你一开始可能认为对表现不利的东西,实际上是一件非常好的事情
所以我建议你不要做我刚才告诉你的事。除非你可能会遇到这样一种情况,你知道你的清单上的项目永远不会超过非常有限的数量。那么你可以考虑不要使用虚拟布局。但是我需要按照上面提到的方法来做,因为计划要做更复杂的事情,并且不可能为每个条件创建itemrenderer。@user1190524我已经用一些其他信息更新了我的答案。谢谢更新,但我尝试的是在item render中的一个组中添加图像/文本,数据中会出现多少图像/文本并不是固定的。因此,基本上它是一个包含文本/图像的行的列表,而一行中的文本/图像的数量不是固定的。因此,我使用AS(该特定行所需的数量)创建这些文本/图像。但如果我滚动列表,itemrender代码将再次执行,如果一行中有5个图像/文本元素,它们将变为10,因为渲染代码将再次执行。如果有更好的方法,请告诉我。Thanks@user1190524只需在ItemRenderer中使用另一个列表。若你们在最初的问题中说明了这个要求,那个就容易多了。嗨,若我使用列表中的列表,那个么我也必须为内部列表创建项目渲染器,它将被固定在和当前列表相同的位置。另外,由于列表的长度可以达到1000,所以您认为它不会消耗太多资源,因为我希望在移动版本中实现相同的列表。
<s:List id="myList" dataProvider="{dp}"
itemRenderer="myItemRenderer" useVirtualLayout="false" />