2010-10-26 41 views
4

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

+2

由于默认情况下,Flex列表将循环使用其项目渲染器,因此您无法可靠地访问给定数据对象的项目渲染器。如果数据对象滚动到列表的可视区域外,甚至可能不存在与该数据对象相关联的呈现器。你试图完成什么? – 2010-10-26 21:07:45

回答

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; 
} 
+0

非常感谢,我需要这样的东西。 – ccsakuweb 2011-12-26 21:25:04

+0

为了使这一直工作,您需要将List的useVirtualLayout设置为false。这样,所有ItemRenderer都会被创建,即使它们不可见。在useVirtualLayout为true的情况下,一些ItemRenderer只会在可见时被创建。 – DoomGoober 2014-10-28 23:34:00

1

东西通过这种方法,你不能渲染是可视区域外,还会有很多其他的问题。

+0

你是对的。我没有选择以前的答案,但很好找到一个解决方案。 – 2012-04-30 12:05:47

+0

由于Flex SDK不支持数据直接呈现器访问,因此对于此问题没有“正确”答案。 – 2013-02-10 06:25:11

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); 
0

我知道这是一个古老的线程,但也许这将帮助别人:

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

这会给你的itemRenderer,如果你有一个自定义的IR那么就使用这个类和演你的集合。

相关问题