Force all item renderers to commitProperties?

安稳与你 提交于 2020-01-03 20:44:41

问题


I have an item renderer that checks an external source for display information. If that information changes, I want to force all item renderer instances to check it.

What's the best way for force all the item renderers in a list or grid to either commitProperties or execute some other method?

  • I've read that resetting the grid.itemRenderer property will make them all initialize.

  • I've also received the suggestion to iterate recursively through all the grid's children and call invalidateProperties on all the UIComponents I find.

Any thoughts? Alternatives?


回答1:


Remember that in Flex Lists you're dealing with virtualization and itemRenderer recycling, so generally only the currently visible itemRenderers actually exist, and are therefore the ones that actually need updating.

The following works for Spark list-based controls:

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

            }

If you've got 100 items, this will update the 10 visible ones and ignore the virtual rest.

If you're working with mx DataGrid, you might want to try a variant of this- but it doesn't use DataGroup / Spark virtualization so I don't have an answer for you off the top of my head.

P.S. I'm putting the finishing touches on a completely Spark-based DataGrid, I'll post the link when I'm done.




回答2:


Datagroup has getItemIndicesInView() which will give you the indicies of all item renderers that are in view. Call getElementAt with those indicies.

I also usually extend ItemRenderer and add the following which will cause the item renderer's state to refresh.

   public function invalidateSkinState():void
   {
      super.invalidateRendererState();
   }



回答3:


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

works fine for me



来源:https://stackoverflow.com/questions/2390637/force-all-item-renderers-to-commitproperties

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!