3

我有一个项目渲染器,它检查外部源以获取显示信息。如果该信息发生变化,我想强制所有项目渲染器实例检查它。

强制列表或网格中的所有项目渲染器commitProperties执行或执行其他方法的最佳方法是什么?

  • 我读过重置 grid.itemRenderer属性将使它们全部初始化。

  • 我还收到了递归遍历所有网格子节点并调用invalidateProperties 我找到的所有 UIComponents 的建议。

有什么想法吗?备择方案?

4

3 回答 3

1

请记住,在 Flex 列表中,您正在处理虚拟化和 itemRenderer 回收,因此通常只有当前可见的 itemRenderer 实际存在,因此是实际需要更新的。

以下适用于基于 Spark 列表的控件:

for ( var i:int=0; i< sparkList.dataGroup.numElements; i++ )
            {
                var element:UIComponent = sparkList.dataGroup.getElementAt( i ) as UIComponent;
                if ( element )
                    element.invalidateProperties();
                else
                    trace("element " + i.toString() + " wasn't there");

            }

如果您有 100 个项目,这将更新 10 个可见项目并忽略虚拟其余部分。

如果您正在使用 mx DataGrid,您可能想尝试这个变体 - 但它不使用 DataGroup / Spark 虚拟化,所以我无法为您提供答案。

PS 我正在对一个完全基于 Spark 的 DataGrid 进行最后润色,完成后我会发布链接。

于 2010-03-06T21:08:22.627 回答
0

Datagroup 具有 getItemIndicesInView() ,它将为您提供所有可见项目渲染器的索引。使用这些指标调用 getElementAt。

我通常还扩展 ItemRenderer 并添加以下内容,这将导致项目渲染器的状态刷新。

   public function invalidateSkinState():void
   {
      super.invalidateRendererState();
   }
于 2011-04-14T03:12:59.447 回答
0
    public function updateAllRenderer():void
    {
        if (!list.dataGroup)
            return;
        if (!list.dataGroup.dataProvider)
            return;

        for ( var index:int=0; index< list.dataGroup.numElements; index++ )
        {
            var item:Object = list.dataGroup.dataProvider.getItemAt(index);
            var renderer:IVisualElement = list.dataGroup.getElementAt( index ) as IVisualElement;
            if ( renderer )
                list.updateRenderer( renderer, index, item );
        }
    }

对我来说很好

于 2014-03-13T07:31:29.597 回答