Flex防止项目渲染器回收?

时间:2011-05-30 06:33:00

标签: flex actionscript-3 itemrenderer

有没有办法阻止在Flex 4.5上回收使用Spark组件呈现的项目?

这可能听起来很荒谬,但实际上这会成功,直到我理解渲染生命周期

4 个答案:

答案 0 :(得分:3)

首先,我不建议你这样做。出于性能原因,项目回收对任何Flex应用程序都至关重要我建议你花时间去理解,而不是试图创建应用程序。

但是如果你需要这样做,你可以随时关闭布局中的虚拟化:

<s:List>
   <s:layout>
      <s:VerticalLayout useVirtualLayout="false" />
   <s:/layout>
</s:list>

默认情况下,虚拟化是真的。

答案 1 :(得分:1)

您是否使用数据设置项目渲染器的完整状态?如果您根据数据计算状态,并忘记清除或重置它,那么由于回收,您将获得错误的输出。例如:

public function set data(value:Object):void
{
     if (value.@blackBack == "true")
     {
          setStyle("backgroundColor", "black");
     }
}

当你第一次看到它时,看起来似乎没问题 - 黑色物品是黑色的。但滚动列表后,您将获得具有黑色背景的重复使用的项目。解决方案始终将样式设置为某个值。解释一下你的问题,也许它是一样的?

答案 2 :(得分:0)

我不知道这是否有帮助,但在介绍ItemRenderers之前,我们曾经创建了n个自定义组件实例,并调用容器的addChild()方法将它们添加到屏幕。不进行回收,生成所有组件实例并将其添加到阶段。如果您拥有大量对象,那不是一个好主意。

for(var i:int = 0; i < numComponents; i++)
{
    var customComponent:CustomComponent = new CustomComponent();
    // set properties to the customComponent, like data, width etc...
    vBox.addChild(customComponent);
}

将vBox设为<mx:VBox id="vBox"/>

如果要重置元素,请调用vBox.removeAllChildren()并重复循环以添加它们。

使用此方法的缺点是,您必须手动删除所有元素,并在更改数据时添加它们。如果未删除某些事件侦听器,则可能会发生内存泄漏。

希望这有帮助。

答案 3 :(得分:-1)

据我所知,不可能阻止物品渲染器的再循环。

关于项目渲染器回收的工作原理,让我试着给出一个简短的解释:

考虑一下您的应用程序中有一个基于列表的组件(如List,DataGrid等)。您可以显示100行数据(以您希望的任何格式)。在大多数情况下,由于屏幕空间限制为了更好的可用性,你不会同时显示100行。相反,你将显示,让我们说10行(使用rowCount属性或给组件一个特定的高度),并使用滚动条查看其余的行所以,在任何给定的时间,在100行中你可以看到10行,其余的90在屏幕外。在内存中保留90个屏幕外行的项目渲染器的实例,而你一次只能查看10行一个很好的性能实践。那么flex框架的作用是它将为可见行创建渲染器(在这种情况下为10)加上一些2或3个额外的渲染器(我不确定究竟有多少)。所以,这里是flex框架只创建13个项目渲染器实例。在滚动时,框架重用已创建的项目渲染器以显示屏幕外行,通过将该特定行的data属性传递给项呈示器。换句话说,第14行将重用为第一行创建的项呈示器,第15行将重用第2行,第16行将重用第3行,依此类推,向下滚动。

希望有所帮助