我在TileList中遇到了与itemRenderers有关的奇怪问题。
这是一个没有itemRenderer的工作示例:152.org/flex /
以下是包含itemRenderer的破碎版本:152.org/brokenExample/
(我没有代表将这两者都作为链接)
两个示例都启用了“查看源”。
要查看问题,请使用损坏的示例,选择一个相册并向下滚动一行。向上滚动,图像将被切换。如果您在工作示例中尝试这样做就可以了。
这似乎是一个广为人知的错误,但我无法找到解决方案。
更新的
我再次开始玩这个例子,发现了别的东西。事实证明,您不必覆盖数据设置器。您可以在itemRenderer中创建一个新方法,该方法在磁贴要刷新时设置。所以诀窍是不要依赖initialize或creationComplete方法。
这就是我对Application中的itemRenderer所拥有的。
<itemRenderers:ImageTile img="{data}"/>
这是我在itemRenderer中的代码。
public function set img(value:String) : void {
trace("setting source: " + value);
this.source = value;
this.name = value.toString().split("/").pop().split(".").shift();
}
I updated my example反映这一变化。
答案 0 :(得分:0)
我没有你的应用程序方便,所以我不能端到端测试,但我看了你的来源。您可能需要覆盖itemRenderer中的数据设置器:
<?xml version="1.0" encoding="utf-8"?>
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()">
<mx:Script>
<![CDATA[
override public function set data(value:Object):void
{
super.data = value;
this.source = data;
this.name = data.toString().split("/").pop().split(".").shift();
}
private function init() : void {
// Removed from your source and transplanted above
}
]]>
</mx:Script>
</mx:Image>
Flex将尝试在列表中重复使用项呈示器(这意味着您可能期望的生命周期事件 - 初始化,creationComplete等 - 不会总是触发),因此如果您想确定您的渲染器当数据项发生更改时(就像滚动事件发生时一样)会更新,最佳做法是覆盖渲染器的数据属性。这很可能解决问题。
答案 1 :(得分:-1)
也许尝试在creationComplete上失效?
从我记得DataGrids(它的工作方式有点类似于tilelist),当一个项目成为焦点时,它会被重新创建。
<mx:itemRenderer>
<mx:Image id="myImage" creationComplete="myImage.invalidate()" />
</mx:itemRenderer>
没试过这段代码,但我认为这是你想要开始寻找的地方。我看了一下你的itemRenderer组件。尝试使用creationComplete而不是初始化来调用您的函数