如何解决list.dataGroup.getElementAt不返回所有元素
|| 我正在尝试遍历列表itemRenderers来更改特定项目的数据。该代码运行良好,直到for索引变为7(这是我列表中可见元素的最大数量)。当索引为7或更大时,getElementAt()函数将返回null。可能是什么问题?var itemRenderer:ItemRenderer;
var numItems:int = list.dataGroup.numElements;
trace(numElements) // outputs 14
for(var i:int = 0; i < numItems; i++){
itemRenderer = list.dataGroup.getElementAt(i) as ItemRenderer;
if (itemRenderer.data.name == \"bar\") {
itemRenderer.data.option = \"foo\";
break;
}
}
解决方法
如果要更改特定项目的数据,为什么不从提供给
dataProvider
的数据中更改它?直接在项目渲染器中更改它是荒谬的。
为了将来参考,之所以失败是因为所谓的虚拟化。本质上,并非所有项目渲染器都被创建,只有可见的渲染器被创建。
, 默认情况下,“ Spark List”使用虚拟布局(useVirtualLayout = true
)。它允许重用项目渲染器并提高性能并减少资源使用。您可以为列表设置useVirtualLayout=false
。
但是,如果您需要从外部列出List的项目渲染器,则很有可能做错了什么。尝试以其他方式解决您的问题,并保持使用虚拟布局。
, 您还可以使用RendererExistenceEvent,该事件在DataGroup的ItemRenderer接收数据并呈现时触发。在数据组上侦听事件rendererAdd。
<s:DataGroup id=\"dataGroupList\" dataProvider=\"{_listData}\"
width=\"100%\" height=\"100%\"
rendererAdd=\"list_rendererAddHandler(event)\"/>
有关更多信息,请查看RendererExistenceEvent的帮助文档。
尽管有人说这不是直接在ItemRenderer中访问和更改数据的最佳实践,但在其他用例中,您可能只需要这样做。例如,如果要基于某些用户交互或状态更改来切换列表的选定属性或启用属性。最佳做法仅适用于最简单的用例,其他用例则要求您使用这些事件或修改控件本身。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。