0

我在 flex 中创建了一个项目渲染器火花列表,但我想在列表中添加新行时调用一个函数,而不是之后。我在渲染列表中得到一个数据对象,我得到要在列表中显示的数据类型,即。无论是文字还是图片。因此,在列表中添加新数据时,我希望在渲染列表中调用一个函数,该函数检查接收到的数据类型,然后它将创建并添加图像元素或文本元素。所以主要问题是我如何获得一个在添加数据时调用的函数。我已经尝试过像 datachange 和添加这样的事件,但是当我们滚动列表时它们会一遍又一遍地调用该函数,但我希望该函数仅在添加数据时调用一次,而不是在病房之后调用。下面是渲染器列表代码,也许你会更好地了解我想要做什么:

<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>

任何帮助将不胜感激。谢谢

4

1 回答 1

1

据我从您显示的代码中可以看出,解决问题的最简单方法是使用两个单独的 ItemRenderer:一个渲染文本,另一个渲染图像。您可以使用SkinnableDataContainer#itemRendererFunction属性而不是itemRenderer.

具有新属性的列表:

<s:List id="myList" dataProvider="{dp}" 
        itemRendererFunction="getItemRenderer" />

返回正确 ItemRenderer 的工厂的函数。

private function getItemRenderer(item:Object):IFactory {
    if (item.msg_type == "text") 
        return new ClassFactory(MyTextItemRenderer);
    if (item.msg_type == "image") 
        return new ClassFactory(MyImageItemRenderer);
}

在这两个不同的 ItemRenderer 中,您可以根据需要显示您的数据。


编辑:为什么dataChange每次滚动时都会触发事件。

实际上,正如您所描述的那样,您的方法没有任何问题,尽管我认为该itemRendererFunction方法可以更好地分离关注点。我可以告诉您,您可以关闭不需要的行为,只需将List#useVirtualLayout属性设置为false.

<s:List id="myList" dataProvider="{dp}" 
        itemRenderer="myItemRenderer" useVirtualLayout="false" />

虽然这将满足您的要求(即只创建一次 ItemRenderers),但这不是一个好的建议。这个属性true默认设置是有充分理由的。

当使用虚拟布局时,项目渲染器仅在需要时创建,即当它们进入视野并需要显示给用户时。这使您可以加载数千个项目而不会损失性能。

假设您加载了 1000 个值对象:这不会占用太多内存或 CPU。但现在你想渲染它们。如果您不使用虚拟布局,则会为所有这些预先创建一个项目渲染器,这意味着数千个图形元素和数千个事件侦听器(具体数量取决于您的设置)。现在会损害慢速计算机的性能。

如果您只使用虚拟布局 - 比如说 - 将一次创建 10 个项目渲染器。如果用户向下滚动,接下来的 10 个将被创建,而刚刚从视图中消失的那些将被删除并最终被垃圾回收。所以你看:你一开始可能认为对性能不利的东西,实际上是一件非常好的事情。

所以我建议你不要做我刚才告诉你的事。除非您可能会遇到这样一种情况,即您知道列表中的项目数量永远不会超过非常有限的数量。那么你可以考虑不使用虚拟布局。

于 2012-02-05T14:15:40.287 回答