Flex:图块切换位置在tilelist中

时间:2009-10-26 21:18:33

标签: flex itemrenderer tilelist

我在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反映这一变化。

2 个答案:

答案 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而不是初始化来调用您的函数