在Flex中,我可以创建一个ItemRenderer来表示Lists DataProvider中的每个项目,但是如何通过DataProviders对象访问ItemRenderer的实例?像myList.getItemRenderer(dp.getItemAt(10));
答案 0 :(得分: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;
}
答案 1 :(得分:1)
通过使用此方法,您无法获得可查看区域之外的渲染器,并且还会出现许多其他问题。
答案 2 :(得分: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);
答案 3 :(得分:1)
我知道这是一个老线程,但也许它会帮助某人:
var item:ItemRenderer = list.dataGroup.getElementAt(0) as ItemRenderer;
这将为您提供ItemRenderer,如果您有自定义IR,那么只需使用该类并进行演员和您的设置。