0

as:list用のカスタムItemRendererを作成しました。これには、MovieClipを含むUIComponentのリストが含まれています。スクロールすると、親/ x / yプロパティは正しいのに、一部のアイテムが表示/レンダリングされません。これがリストのItemRendererのコードです。render()は、renderイベントがトリガーされたときに発生します:

<?xml version="1.0" encoding="utf-8"?>    
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="true" creationComplete="init();" render="render();">

<s:Label id="lbl" text="{data.getName()}" width = "{width}" fontSize="14"/>

<fx:Script>
    <![CDATA[
        import Types.ReversingMovieClip;

        import mx.core.UIComponent;

        private var exDisplay:DisplayObject;
        private var inited:Boolean = false;
        private var uic:UIComponent = new UIComponent();

        public function init():void
        {
            // first item is firing creationComplete twice !
            if (!inited)
            {
                exDisplay = data.getDisplay();
                // Dangerous. if exDisplay has a different event of CLICK, it won't set it here.
                // On the other hand.. this happens at the startup.. so.. what to do.
                if (exDisplay is ReversingMovieClip && !exDisplay.hasEventListener(MouseEvent.CLICK))
                    exDisplay.addEventListener(MouseEvent.CLICK, playPauseClip);
                inited = true;
                addElement(uic);
            }
        }

        public function render():void
        {
            if (exDisplay != null && exDisplay.parent == uic)
                uic.removeChild(exDisplay);

            exDisplay = data.getDisplay();

            //if (exDisplay.width != width && exDisplay.height != width)
                resizeDisplay();

            uic.width = exDisplay.width;
            uic.height = exDisplay.height;


            uic.addChild(exDisplay);


            //ReversingMovieClip.setPlayBySpeed(true);
            //ReversingMovieClip.setSpeed(1);
        }

        private function resizeDisplay():void
        {

            if (exDisplay.width > exDisplay.height)
            {
                exDisplay.width = width;
                exDisplay.scaleY = exDisplay.scaleX;
            }
            else
            {
                exDisplay.height = width;
                exDisplay.scaleX = exDisplay.scaleY;
                exDisplay.x = width / 2 - exDisplay.width / 2;
            }
            uic.y = 12;
            /* trace("listw " + width + "\nexHeight " + exDisplay.height + "exWidth " + 
                exDisplay.width + "\nuicW " + uic.width + " " + uic.height); */

        }

        private function playPauseClip(e:Event):void
        {
            var mc:ReversingMovieClip = (e.currentTarget as ReversingMovieClip);
            if (mc.isPlaying())
                mc.stop();
            else mc.play();
        }
    ]]>
    </fx:Script>

</s:ItemRenderer>

UIComponentまたはMovieClipを返すdata.getDisplay()の配置は問題ではありません。removeChildAtを使用して、このアイテムで最後に使用されたMovieClipを削除し、新しいものを配置します。それは機能しますが、スクロール中にいくつかのランダムなアイテムが表示されず、もう一度スクロールするとランダムに表示されます。

助けてください..ありがとう。

4

2 に答える 2

2

あなたはたくさんのコードを持っています。もっと詳しく見ていきますが、要点は、レンダラーのデータプロパティが変更されたときにコンポーネントを変更しないということです。そのため、レンダラーは、表示される値をいつ変更するかをどのように知るのでしょうか。

したがって、最初のコメントは、リストコンポーネントの最初のレンダリング中に単一のレンダラーが作成されることが多いということです。これは、creationCompleteが2回起動するのを見るのは珍しいことではありません。

2番目のコメントは、creationCompleteは、初期化コードにとって恐ろしい場所であることが多いということです。SparkまたはHaloのFlexコンポーネントのライフサイクルを確認してください。pre-initializeイベント、またはコンポーネントの子にアクセスする場合はinitialzeイベントの方が適しています。

第三に、レンダリングのリサイクルについて調べて読む必要があります。要点は、リストをスクロールすると、各レンダラーが再利用されるということです。データが変更されます。再作成されません。Listコンポーネントは、新しいデータを渡すだけで、レンダラーが何をすべきかを知っていることを期待します。'creationComplete'コードは、ほとんどの場合、dataChangeイベントハンドラーに移動する必要があります。

第4に、Flexコンポーネントのライフサイクルを利用する必要があります。レンダリングとサイズ変更の表示メソッドは、コンポーネントの子のサイズ設定と配置を処理することになっているupdateDisplayList()に移動する必要があるようです。

レンダラーを書き直すにはかなりの時間がかかります。途中で諦めました。しかし、私が提供したリンクのいくつかを読んで、それをクラックして、問題が発生した場合は戻ってきてください。

于 2011-11-28T03:16:21.780 に答える
0

どこから呼んでいますか?コンポーネントのライフサイクルを活用して、データが変更されたときにレンダラーデータを更新しているようには見えません。より多くのコードを投稿すると、「データが変更されたときにフラグを設定し、commitProperties、updateDisplaylistを使用して、変更を反映するように測定する」よりも、より具体的な提案を提供する方が簡単です。

于 2011-11-27T15:09:58.903 に答える