0

TileList 内の itemRenderers で奇妙な問題が発生しています。

itemRenderer を使用しない実際の例を次に示します: 152.org/flex/

itemRenderer を使用した壊れたバージョンは次のとおりです: 152.org/brokenExample/
(これらの両方をリンクする担当者がいません)

両方の例で「ソースの表示」が有効になっています。

壊れた例を使用して問題を確認するには、アルバムを選択して 1 行下にスクロールします。上にスクロールすると、画像が切り替わります。実際の例でこれを試してみると、問題ありません。

これは広く知られているバグのようですが、解決策が見つかりません。

更新
この例をもう一度試してみたところ、何か他のことがわかりました。データセッターをオーバーライドする必要がないことがわかりました。タイルを更新するたびに設定される itemRenderer に新しいメソッドを作成できます。したがって、秘訣は、initialize または creationComplete メソッドに依存しないことです。

これは、アプリケーションの 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();
}

この変更を反映するように例を更新しました。

4

2 に答える 2

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 はリスト内のアイテム レンダラーを再利用しようとします (つまり、予期されるライフサイクル イベント -- initialize、creationComplete など -- が常に発生するとは限りません)。データ項目が変更された場合 (スクロール イベントが発生した場合)、ベスト プラクティスはレンダラーのデータ プロパティをオーバーライドすることです。これで問題が解決する可能性が高くなります。

于 2009-10-26T23:24:14.010 に答える
-1

creationComplete で無効化してみてはいかがでしょうか。

私が DataGrids (タイルリストと同様に機能する) で思い出したことから、項目がフォーカスされると再作成されます。

<mx:itemRenderer>
  <mx:Image id="myImage" creationComplete="myImage.invalidate()" />
</mx:itemRenderer>

このコードを試したことはありませんが、ここから探し始めたいと思います。itemRenderer コンポーネントを調べました。あなたの関数を呼び出すために初期化の代わりにcreationCompleteを試してください

于 2009-10-26T21:46:00.133 に答える