Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex列表项渲染器_Apache Flex_Actionscript_Renderer - Fatal编程技术网

Apache flex Flex列表项渲染器

Apache flex Flex列表项渲染器,apache-flex,actionscript,renderer,Apache Flex,Actionscript,Renderer,我已经在flex中创建了一个项目列表,但我想在列表中添加新行时调用一个函数,而不是之后。我在渲染列表中得到一个数据对象,在其中我得到要在列表中显示的数据类型,即文本或图像。在列表中添加新数据时,我希望在呈现列表中调用一个函数,该函数检查接收到的数据类型,然后创建并添加一个图像元素或文本元素。所以主要的问题是如何得到一个函数,这个函数在添加数据时被调用。我尝试过datachange和Add之类的事件,但当我们滚动列表时,它们会一遍又一遍地调用函数,但我希望函数只在添加数据时调用一次,而不是在添加数

我已经在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" />