更新sparkProvider更改的列表控件

时间:2013-01-23 16:07:12

标签: actionscript-3 flex flex4.5

我正在使用spark List控件,它绑定到这样的类的实例:

[Event(name="collectionChange", type="mx.events.CollectionEvent")]
public class HierarchicalCollectionListAdapter extends EventDispatcher implements IList
{
...
}

每次此集合发送“reset”collectionChange事件时,我想让List完全重新绘制。现在要实现这一点,每次收集更新后我都要调用这段代码:

var _itemRenderer:IFactory = _list.itemRenderer;
_list.itemRenderer = null;
_list.itemRenderer = _itemRenderer; 

有没有办法以更优雅的方式做到这一点?

2 个答案:

答案 0 :(得分:0)

我很难看到这里发生了什么,但看起来您的列表dataProvider未展开ListCollectionView,因此您无法使用refresh()

但是,您可以使用invalidateDisplayList()

强制重绘

我会尝试这样的事情:

_list.dataGroup.invalidateDisplayList();

答案 1 :(得分:0)

如果有人遇到同样的问题,我会留下我的解决方案。

我能做的最好的事情 - 创建扩展列表控件,每次收集更新时都会自动刷新。因此,基于spark列表创建新控件并在其中添加此代码:

<fx:Script>
    <![CDATA[
        import mx.collections.IList;
        import mx.events.CollectionEvent;
        import mx.events.CollectionEventKind;

        /**
         * Subscribe to collection change event.
         */
        override public function set dataProvider(value:IList):void
        {
            if (dataProvider)
                dataProvider.removeEventListener(CollectionEvent.COLLECTION_CHANGE,
                    dataProvider_collectionChangeHandler);

            if (value)
                value.addEventListener(CollectionEvent.COLLECTION_CHANGE, _collectionChangeHandler, false, 0, true);

            var _itemRenderer:IFactory = this.itemRenderer;
            this.itemRenderer = null;
            this.itemRenderer = _itemRenderer; 

            super.dataProvider = value;
        }

        /**
         * If collection has changed - redraw list by resetting itemRenderer.
         */
        private function _collectionChangeHandler(event:Event):void
        {
            if (event is CollectionEvent)
            {
                var ce:CollectionEvent = CollectionEvent(event);

                // We don't need to refresh if any collection element will change.
                if(ce.kind != CollectionEventKind.UPDATE)
                {
                    var _itemRenderer:IFactory = this.itemRenderer;
                    this.itemRenderer = null;
                    this.itemRenderer = _itemRenderer;
                }
            }
        } 

    ]]>
</fx:Script>