2012-04-26 14 views
1

我在Flex移動列表組件中使用項呈示器,項呈示器必須根據接收到的輸入數據逐行顯示不同的圖像。我在creationComplete項目渲染器中執行這些所有控件,以便如果它的「X」使圖像的源代碼等等。但是當我在創建List之後滾動它時,它會按照不同的順序重新設置項目,以便如果「Item1」爲在列表的第一行滾動後,它將轉到最後一行,最後一行到達第一位。列表中的Flex移動項呈現器

List組件代碼:

<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> 

我覺得一切都在我的代碼正確的,但我必須添加一些額外的線路。任何人都可以幫助我解決這個棘手的問題嗎?

回答

0

添加<s:List useVirtualLayout="false">爲我解決了這個問題!

+0

-1 ......雖然我毫不懷疑這個作品,它不是性能或內存使用原因的最佳方法,這兩件事情尤其在移動設備上非常重要。編寫渲染器的正確方法是偵聽dataChange事件。查看我的答案瞭解更多詳情。 – JeffryHouser 2012-04-26 13:50:25

1

做這些所有的控件在creationComplete項目渲染這樣,如果 它的「X」使圖像這一等

這是一個問題的根源。 Flex列表只顯示屏幕上顯示的內容,不顯示屏幕外的內容。滾動渲染器時,將不會創建新的渲染器。 creationComplete事件不會再次觸發,以更新正在顯示的數據的呈現。

重用渲染器的過程稱爲渲染器回收。要正確地創建渲染器,您必須監聽dataChange事件,以根據數據調整渲染器顯示。

有些人喜歡重寫itemRenderer中的set數據方法,並在那裏進行更改。這也是一個同樣可以接受的方法。

將useVirtualLayout設置爲false的原因是因爲它告訴列表單獨呈現每個項目而不使用渲染器回收。對於移動設備上的性能或內存使用原因,這不是最佳選擇。

Please read the docs on using the data property in itemRenderers

+0

我試着重寫設置數據的方法,但有一個混亂時,我滾動..你可以舉一個例子使用dataChange?! – 2012-04-26 14:18:10

+0

@lbstr既然你沒有顯示你的完整itemRenderer,只是它的片段;我決定不嘗試重寫它以使用dataChange()方法。如果你能詳細說明「一團糟」的含義;我可能會提供其他幫助。 – JeffryHouser 2012-04-26 14:43:27

+0

在設置數據的情況下,當我滾動列表它重新生成新的項目實例..並重新安置它們在不同的地方以及.. – 2012-04-26 14:45:11