我正在尝试遍历我的列表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;
}
}
答案 0 :(得分:2)
Spark List默认使用虚拟布局(useVirtualLayout = true
)。它允许重用项呈示器并提高性能并减少资源使用。在您的情况下,您可以为列表设置useVirtualLayout=false
。
但如果您需要从外部列出List的项目渲染器,那么您很可能会出错。尝试以其他方式解决您的问题并继续使用虚拟布局。
答案 1 :(得分:2)
如果您想更改特定商品的数据,为什么不从您提供给dataProvider
的数据中更改?直接在项呈示器中更改它是荒谬的。
为了将来参考,失败的原因是因为虚拟化。基本上,并非所有项目渲染器都是创建的,只有可见的。
答案 2 :(得分:1)
您还可以使用RendererExistenceEvent,它在DataGroup的ItemRenderer接收数据并被渲染时触发。在DataGroup上侦听事件rendererAdd。
<s:DataGroup id="dataGroupList" dataProvider="{_listData}"
width="100%" height="100%"
rendererAdd="list_rendererAddHandler(event)"/>
有关详细信息,请查看RendererExistenceEvent的帮助文档。
虽然有人说直接访问和更改ItemRenderer中的数据不是最佳做法,但可能还有其他用例需要这样做。例如,如果要根据某些用户交互或状态更改来切换列表的选定或启用属性。最佳实践仅适用于最简单的用例,其他用例要求您使用这些事件或修改控件本身。