[英]Flex prevent item renderer recycling?
有没有办法防止在 Flex 4.5 上回收使用 Spark 组件渲染的项目?
听起来可能很荒谬,但实际上这可以解决问题,直到我更多地了解渲染生命周期
首先,我不建议您这样做。 出于性能原因,项目回收对于任何 Flex 应用程序都是必不可少的。 我建议您花时间去理解,而不是在尝试创建应用程序时大吃一惊。
但是如果你需要这样做,你总是可以在布局中关闭虚拟化:
<s:List>
<s:layout>
<s:VerticalLayout useVirtualLayout="false" />
<s:/layout>
</s:list>
默认情况下,虚拟化是真的。
您是否使用数据设置项目渲染器的完整 state? 如果你根据数据计算state,忘记清除或重置它,你会因为回收而得到错误的output。 例如:
public function set data(value:Object):void
{
if (value.@blackBack == "true")
{
setStyle("backgroundColor", "black");
}
}
当你第一次看到它时,它看起来还不错——黑色的物品是黑色的。 但是在你滚动列表之后,你会得到到处都是黑色背景的重复使用的项目。 解决方案总是将样式设置为某个值。 多解释一下你的问题,也许是一样的?
我不知道这是否有帮助,但在介绍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()
并重复循环以添加它们。
使用此方法的缺点是您必须手动删除所有元素并在数据更改时添加它们。 如果不删除某些事件侦听器,则可能会发生 Memory 泄漏。
希望这可以帮助。
据我所知,不可能不阻止项目渲染器的回收。
关于物品渲染器回收的工作原理,让我尝试做一个简单的解释:
考虑到您的应用程序中有一个基于列表的组件(如 List、DataGrid 等)。您正在显示,比如说,100 行数据(以您希望的任何格式)。在大多数情况下,由于屏幕空间限制和更好可用性,您不会同时显示 100 行。相反,您将显示 10 行(使用 rowCount 属性或为组件指定特定高度),并使用滚动条查看项目的 rest。所以在任何给定时间,在 100 行中,您有 10 行可见,并且 rest 90 不在屏幕上。在 memory 中保留 90 个屏幕外行的项目渲染器的实例,而您一次只能查看 10 行并不是一个好的性能练习。所以 flex 框架所做的是它将为可见行创建渲染器(在这种情况下为 10 个)加上一些 2 或 3 个额外的渲染器(我不确定到底有多少)。所以,这里 flex 框架只创建13项渲染器实例 s. 滚动时,框架通过将特定行的数据属性传递给项目渲染器,重用已创建的项目渲染器来显示屏幕外的行。换句话说,第 14 行将重用为第一行创建的项目渲染器,第 15 行将重用第 2 行,第 16 行将重用第 3 行,依此类推,同时向下滚动。
希望有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.