我正在使用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;
有没有办法以更优雅的方式做到这一点?
答案 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>