Spark List是否支持IDropInItemRenderer接口?
看起来好像新的IDropInItemRenderer
List组件不符合IDropInItemRenderer
接口。
也就是说 - 如果我在渲染器上实现了IDropInItemRenderer
,那么listData
的setter永远不会被调用。
我错过了什么,或者现在这个界面已被弃用?
如果是这样,为渲染器提供类似dataProvider上下文信息的建议方法是什么?
例如,我希望集合中最后一个项目的渲染器的行为稍有不同。
我发现IItemRenderer
现在定义了一个listIndex
属性,但是如果不知道源dataProvider的计数,这种方法将无法正常工作。
这是我最终使用的解决方法。
按照自己的方式, DataGroup
正在滴落Spark的构图优势,因为它暴露了rendererUpdateDelegate
属性,您可以使用自己的类设置rendererUpdateDelegate
属性,以提供您所需的任何自定义函数。
虽然接口在没有被广告宣传的情况下被丢弃令人沮丧,但这种方法更加强大。
这是一个示例类。 在我的示例中,我希望最后的渲染器将其collapsable
属性设置为false
:
/**
* Decorates another IItemRendererOwner (eg., a DataGroup) and augments the updateRenderer method
* to set the isCollapsable property */
public class ThreadMessageRendererUpdateDelegate implements IItemRendererOwner
{
private var _dataGroup:DataGroup;
public function get dataGroup():DataGroup
{
return _dataGroup;
}
public function set dataGroup(value:DataGroup):void
{
_dataGroup = value;
if (dataGroup)
{
dataGroup.rendererUpdateDelegate = this;
}
}
public var dataProvider:ArrayCollection;
public function ThreadMessageRendererUpdateDelegate(owner:DataGroup=null)
{
this.dataGroup = owner;
}
public function itemToLabel(item:Object):String
{
return dataGroup.itemToLabel(item);
}
public function updateRenderer(renderer:IVisualElement, itemIndex:int, data:Object):void
{
dataGroup.updateRenderer(renderer,itemIndex,data);
if (renderer is ThreadMessageRenderer)
{
ThreadMessageRenderer(renderer).collapsable = itemIndex < dataProvider.length - 1;
}
}
}
这是它的示例用法:
<fx:Declarations>
<viewer:ThreadMessageRendererUpdateDelegate dataProvider="{dataProvider}" dataGroup="{threadList}" />
</fx:Declarations>
<fx:Script>
<![CDATA[
[Bindable]
public var dataProvider:ArrayCollection
]]>
</fx:Script>
<s:DataGroup height="100%"
width="100%"
dataProvider="{dataProvider}"
itemRenderer="ThreadMessageRenderer"
id="threadList"
>
</s:DataGroup>
人! 只花了很DataGroup.rendererUpdateDelegate(...)
试图找到DataGroup.rendererUpdateDelegate(...)
,最终发现为什么我不能,这礼貌的SO贴子。
无论如何,想想rendererUpdateDelegate
属性的(消失)以及您提供的更多一点,我意识到这两者都不是必须的。
DataGroup
有rendererAdd
事件,它可以在正确的时间为你提供足够的信息来做你想做的事情; 例如:
...
<s:DataGroup id="dg"
dataProvider="{model.dataProvider}"
itemRenderer="{model.itemRendererFactory}"
rendererAdd="model.updateRenderer(event.data, event.index, event.renderer)">
...
...在model
我们有:
public function updateRenderer(data:Object, index:int, renderer:IVisualElement):void
{
if (renderer is ICollapsable)
{
ICollapsable(renderer).collapse = index < dataProvider.length - 1;
}
}
更少的代码行和更清晰的意图
链接地址: http://www.djcxy.com/p/34609.html上一篇: Does Spark List honour the IDropInItemRenderer interfaces?
下一篇: Flex 4: Item renderer and setting values for named objects (Odd Bug)