list.dataGroup.getElementAt()不返回所有元素

时间:2011-05-27 15:18:47

标签: flex actionscript-3 list flex4 itemrenderer

我正在尝试遍历我的列表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;
        }
}

3 个答案:

答案 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中的数据不是最佳做法,但可能还有其他用例需要这样做。例如,如果要根据某些用户交互或状态更改来切换列表的选定或启用属性。最佳实践仅适用于最简单的用例,其他用例要求您使用这些事件或修改控件本身。