【问题标题】:How can I get the ItemRenderer of a Flex Spark List from its DataProvider Object?如何从其 DataProvider 对象中获取 Flex Spark 列表的 ItemRenderer?
【发布时间】:2011-04-30 21:13:38
【问题描述】:

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

【问题讨论】:

  • 由于 Flex 列表默认回收其项目渲染器,因此您将无法可靠地访问给定数据对象的项目渲染器。如果数据对象滚动到列表的可视区域之外,甚至可能没有与数据对象关联的渲染器。你想要完成什么?

标签: apache-flex itemrenderer dataprovider flex-spark


【解决方案1】:
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;
}

【讨论】:

  • 非常感谢,我需要这样的东西。
  • 为了让它一直工作,你需要将 List 的 useVirtualLayout 设置为 false。这样,即使不可见,也会创建所有 ItemRenderer。如果 useVirtualLayout 为 true,一些 ItemRenderer 只会在它们可见时创建。
【解决方案2】:

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

【讨论】:

  • 你是对的。我已取消选择上一个答案,但如果能找到解决方案会很好。
  • 这个问题没有“正确”答案,因为 Flex SDK 不支持通过数据直接访问渲染器。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2012-02-11
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多