0

アクションスクリプトは、組み込みのレンダラーと比較して、より高速でカスタマイズ可能なインターフェイスを提供するように見えるため、純粋にアクションスクリプトで(Flash Builder 4.6で)アイテムレンダラーを作成しようとしています。(ラベル/アイコンなど)。

リストに画像と 2 つのテキスト フィールドを表示したかったのです。現在、これらの要素はすべてキャンバスに配置されていますが、スクロールを開始するとすぐに (そして仮想リストが有効になります)、古い要素はステージから削除されません。例: スクロール前 http://i.stack.imgur.com/Mk5HX.png スクロール後 http://i.stack.imgur.com/Qt7wZ.png

データは、名前、画像、会社、役職に保存されます。

この問題に関するヘルプ、または実際に私がやろうとしていることを行うためのより良い方法は大歓迎です。

現在、私はクラスを持っています(インポートなどを削除しました)

public class UILabel2 extends IconItemRenderer
    {
        public function UILabel2() {
            super();
        }
override public function set data(value:Object):void
        {
            super.data = value;
            var DBname:String = data.name as String;
            var DBimage:String = data.image as String;
            var DBcompany:String = data.Company as String;
            var DBtitle:String = data.Title as String;

            //iconField = location;

            trace(DBname);
            label = DBname;
            messageField = "Peanuts";

            //iconWidth=64;
            //iconHeight=64;
            avatarHolder = new Graphic();
            avatar = new BitmapImage();

            iconField = DBimage;

            avatar.fillMode = "clip";
            avatar.source = DBimage;
            avatarHolder.width = 64;
            avatarHolder.height = 64;

            avatarHolder.addElement( avatar );
            addChild(avatarHolder);

            text2 = new TextField();
            text2.x = textMargin;
            text2.y = 45;
            text2.text = DBcompany;
            addChild(text2);

            var text3:TextField = new TextField();
            text3.x = textMargin;
            text3.y = 25;
            text3.text = DBtitle;
            addChild(text3);
            //trace(listArrow1MED);

            arrowHolder = new Graphic();

            //arrowHolder.width = 20;
            //arrowHolder.height = 20;
            arrowHolder.x= Wsize-40;
            //trace(Wsize);

            arrow = new BitmapImage();



            arrow.fillMode = "clip";
            arrow.source = listArrow1LGE;



            arrowHolder.addElement( arrow );
            addChild(arrowHolder);


            //iconField = avatar;
        }
4

1 に答える 1

0

リソースの使用を最小限に抑えるために、Flash は ItemRenderer をリサイクルします。これは、各 ItemRenderer が 1 回構築され、そのデータが複数回変更される可能性があることを意味します。

あなたの場合、これが意味することは、レンダラーのデータが設定されるたびに、レンダラーに新しいコンポーネント (テキスト フィールド、画像) が作成されるということです。

これを修正するために必要なこと:

  1. すべての create component / addElement / addChild コードをコンストラクターに移動します。
  2. これらのコンポーネントへの参照を格納する変数を作成します。
  3. ではset data、新しいコンポーネントを作成する代わりに、これらのオブジェクトによって表示されるデータを変更します。
于 2012-05-09T12:51:19.020 に答える