代码之家  ›  专栏  ›  技术社区  ›  Richard Haven

是否强制所有项目呈现程序使用commitProperties?

  •  3
  • Richard Haven  · 技术社区  · 15 年前

    我有一个项目渲染器,检查显示信息的外部源。如果该信息发生更改,我希望强制所有项呈现器实例检查它。

    强制列表或网格中的所有项目呈现器 commitProperties 或者执行其他方法?

    • 我读过重置 grid.itemRenderer 财产将使

    • 递归遍历所有 invalidateProperties 在我找到的所有组件上。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Yarin    15 年前

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

    以下工作适用于基于火花列表的控件:

    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虚拟化,所以我没有一个现成的答案。

        2
  •  0
  •   swidnikk    14 年前

    数据组具有getItemIndicatesInView(),它将为您提供视图中所有项目呈现器的标记。用这些标记调用getElementAt。

    我通常也会扩展ItemRenderer并添加以下内容,这将导致ItemRenderer的状态刷新。

       public function invalidateSkinState():void
       {
          super.invalidateRendererState();
       }
    
        3
  •  0
  •   Tseveen D    11 年前
        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 );
            }
        }
    

    对我来说很好