1

フレックスモバイルリストコンポーネントでアイテムレンダラーを使用します。アイテムレンダラーは、受信した入力データに従って行ごとに異なる画像を表示する必要があります。これらのすべてのコントロールは、アイテム レンダラーの creationComplete で行うので、その「X」がイメージのソースを作成する場合などに使用します。しかし、List の作成後にスクロールすると、アイテムが再設定されますが、順序が異なるため、「Item1」がスクロール後のリストの最初の行では、最後の行に移動し、最後の行が最初の場所になります。

コンポーネント コードのリスト:

<s:List id="lst" dataProvider="{dp}" width="100%" height="100%" 
        itemRenderer="renderer.YataklarViewRenderer"
        contentBackgroundAlpha="0" borderColor="#FFFFFF" borderVisible="true" >

    <s:layout>
        <s:VerticalLayout 
            horizontalAlign="center" 
            paddingBottom="10"
            paddingTop="10"
            paddingLeft="10"
            paddingRight="10"
            />
    </s:layout>
</s:List>

アイテム レンダラー コード:

protected function yataklarItem_creationCompleteHandler(event:FlexEvent):void
            {
                trace("Creation complete: "+ data['servisAdi']);    


                var servisAdi:String = data['servisAdi'];

                //header text ekle
                this.addElement(header);
                header_text.text = servisAdi;


                var odalar:ArrayCollection = new ArrayCollection();

                odalar = data['odalar'];

                for(var i:int=0;i<odalar.length;i++){



                    var mainContent:VGroup = new VGroup();
                    //                  mainContent.paddingBottom
                    mainContent.percentWidth = 100;
                    mainContent.percentWidth = 100;
                    mainContent.horizontalAlign = "center";
                    mainContent.verticalAlign = "middle";


                    var hContent:HGroup = new HGroup();
                    hContent.percentWidth = 100;
                    hContent.verticalAlign = "middle";
                    hContent.horizontalAlign = "left";


                    var col1:HGroup = new HGroup();
                    col1.percentWidth = 10;
                    col1.verticalAlign = "middle";
                    col1.horizontalAlign = "center";

                    var col2:HGroup = new HGroup();
                    col2.percentWidth = 20;
                    col2.verticalAlign = "middle";
                    col2.horizontalAlign = "center";


                    var imgCol:Image = new Image();
                    var txtOdaAdi:Label = new Label();

                    var oda:Object = new Object();
                    oda = odalar.getItemAt(i);

                    var odaAdi:String = oda['odaAdi'];
                    var baskinCinsiyyet:String = oda['baskinCinsiyet'];

                    txtOdaAdi.text = odaAdi;
                    imgCol.source = "images/yataklar/baskin"+baskinCinsiyyet+".png";

                    col1.addElement(imgCol);
                    col2.addElement(txtOdaAdi);


                    var ytk:ArrayCollection = new ArrayCollection();
                    ytk = oda['yataklar'];

                    var yataklarCol:HGroup = new HGroup();
                    yataklarCol.percentWidth = 70;
                    yataklarCol.horizontalAlign = "left";
                    yataklarCol.verticalAlign = "center";


                    for( var j:int=0;j<ytk.length;j++){

                        var yatakG:VGroup = new VGroup();
                        yatakG.gap = 5;
                        yatakG.horizontalAlign = "center";
                        yatakG.verticalAlign = "middle";

                        var yatak:Object = new Object();
                        yatak = ytk.getItemAt(j);

                        var yatakNo:int = yatak['yatakNo'];
                        var durumu:String = yatak['durumu'];

                        //uzerine tiklandiginda
                        var vizitId:String = yatak['vizitId'];
                        var hastaId:String = yatak['hastaId'];
                        var adiSoyadi:String = yatak['adiSoyadi'];


                        var txtYatakNo:Label = new Label();
                        txtYatakNo.text = yatakNo.toString();

                        var imgYatakImg:Image = new Image();
                        imgYatakImg.source = "images/yataklar/yatak"+durumu+".png";

                        yatakG.addElement(imgYatakImg);
                        yatakG.addElement(txtYatakNo);


                        yataklarCol.addElement(yatakG);
                    }


                    hContent.addElement(col1);
                    hContent.addElement(col2);
                    hContent.addElement(yataklarCol);

                    mainContent.addElement(hContent);
                    mainContent.addElement(line);

                    this.addElement(mainContent);
                }




            }
<fx:Declarations>


        <s:Group id="header" width="100%" height="50">

            <s:Rect 
                width="100%" height="100%">
                <s:fill>
                    <s:LinearGradient rotation="90">
                        <s:GradientEntry color="0x314F83" />
                    </s:LinearGradient>
                </s:fill>
            </s:Rect>

            <s:VGroup id="vgt" paddingBottom="10" paddingTop="10" paddingLeft="10" paddingRight="10" gap="10" width="100%" 
                      verticalAlign="middle" horizontalAlign="left" height="100%">
                <s:Label id="header_text" color="#FFFFFF" verticalAlign="middle" height="100%"/> 
            </s:VGroup>

        </s:Group>


        <s:Line id="line" width="100%">
            <s:stroke>
                <s:SolidColorStroke color="0x5b5b5b" weight="2"/>
            </s:stroke>
        </s:Line>






    </fx:Declarations>


    <s:layout>
        <s:VerticalLayout verticalAlign="top" horizontalAlign="center" />       
    </s:layout>

私のコードではすべてが正しいと思いますが、余分な行を追加する必要があります。誰かがそのトリッキーな行で私を助けることができますか?

4

2 に答える 2

1

これらのすべてのコントロールをアイテム レンダラーの creationComplete で実行して、その「X」がイメージのソースをこれなどにするようにします。

それは問題だ。Flex List は、画面に表示されているもののみをレンダリングし、画面外のものはレンダリングしません。スクロールするとレンダラーが再利用されますが、新しいレンダラーは作成されません。表示されているデータのレンダリングを更新するために、creationComplete イベントが再度発生することはありません。

レンダラーを再利用するプロセスは、レンダラーのリサイクルと呼ばれます。レンダラーを適切に作成するには、dataChange イベントをリッスンして、データに基づいてレンダラーの表示を微調整する必要があります。

itemRenderer で set data メソッドをオーバーライドし、そこで変更を行うことを好む人もいます。これも同様に受け入れられるアプローチです。

useVirtualLayout を false に設定する理由は、レンダラーのリサイクルを利用せずにすべてのアイテムを個別にレンダリングするようにリストに指示するためです。モバイルでのパフォーマンスやメモリ使用量の理由から、これは最適な選択ではありません。

itemRenderers の data プロパティの使用に関するドキュメントをお読みください

于 2012-04-26T13:46:35.567 に答える
0

追加<s:List useVirtualLayout="false">すると問題が解決しました!

于 2012-04-26T12:23:26.573 に答える