4

在 Flex 中,我可以创建一个 ItemRenderer 来表示 Lists DataProvider 中的每个项目,但是如何通过 DataProviders 对象访问 ItemRenderer 的实例?就像是myList.getItemRenderer(dp.getItemAt(10));

4

4 回答 4

15
public function getItemRenderer(list:List, item:Object):ItemRenderer
{
    var dataGroup:DataGroup = list.dataGroup;
    var n:int = dataGroup.numElements;
    for (var i:int = 0; i < n; i++)
    {
        var renderer:ItemRenderer = dataGroup.getElementAt(i) as ItemRenderer;
        if (renderer && renderer.data == item)
            return renderer;
    }
    return null;
}
于 2010-10-27T15:59:23.957 回答
1

使用这种方法,无法获取到超出可视区域的渲染器,还会出现很多其他问题。

于 2012-03-16T07:06:59.600 回答
1

如果您需要更改项目渲染器的行为方式,请更改导致该行为的数据。

var items:ArrayCollection = this.dataProvider as ArrayCollection;
    var newItems:ArrayCollection = new ArrayCollection();
    if (items.length > 0) {
        for (var i:int = 0; i < items.length; i++) {
            var item:Object = items[i] as Object;

            if (!item.editMode) {
                item.editMode = true;
            } else {
                item.editMode = false;
            }

            newItems.addItem(item);
        }
    }

    this.dataProvider = null;
    this.dataProvider = newItems;

这是一个简单的示例,其中 I 将项目标记为可删除,并且由于数据已更改,渲染器也会随之更改。对于较大的数据集,我知道这可能会有点慢,但它可以让你控制你想要的。

如果需要更换一个渲染器,只需修改dataProvider或dataGroup中对应对象上的数据即可。

var item:Object = this.getItemAt(index);
于 2013-02-13T19:09:14.950 回答
1

我知道这是一个旧线程,但也许它会帮助某人:

var item:ItemRenderer = list.dataGroup.getElementAt(0) as ItemRenderer;

这将为您提供 ItemRenderer,如果您有自定义 IR,则只需使用该类并投射和您的设置。

于 2017-05-22T17:51:22.953 回答