2012-02-29 15 views
1

私のカスタムiconitemrendererリストで不思議な動作を修正しようとしています:リストを含むビューをビューに変更してスクロールを開始すると、ビューの変更後に最初にスクロールするときに1回だけ表示されます(完全に再描画されます)。 IconItemRendererでFlex Mobile:IconItemRendererリストの不思議な動作

私は、チェックマークを追加します。

<s:IconItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"> 
... 
override protected function commitProperties():void 
{ 
    //create checkbox 
    if(!checkMarkImage && data.isChecked) { 
     //create image holder 
     imageHolder = new Group; 
     addChild(imageHolder); 

     //create image 
     checkMarkImage = new BitmapImage(); 
     checkMarkImage.source = checkBoxSource; 

     imageHolder.addElement(checkMarkImage); 
    } 
    //delete checkmark 
    else if(checkMarkImage && !data.isChecked) { 
     removeChild(imageHolder); 
     imageHolder = null; 
     checkMarkImage = null; 
    } 

    super.commitProperties(); 
} 

override protected function layoutContents(w:Number, h:Number):void 
{ 
    super.layoutContents(w, h); 

    //layout the checkmark 
    if(checkMarkImage) { 
     // don't do it like this! (see correct answer) 
     checkMarkImage.x = w-40; 
     checkMarkImage.y = 14; 
    } 
} 

リストの変更ハンドラは、選択した項目にマークを設定し、古いものから削除します。これが行われた後、popView()が呼び出されますが、このビューに再び来ると、リストはaddHandlerビューで作成され、スクロールを開始すると、上記のように動作します。

//list change 
protected function myList_changeHandler(event:IndexChangeEvent):void 
{ 
    //is already selected? 
    var item:Object = myList.selectedItem; 
    if(!item.isChecked) { 
     //deselect the other one? 
     var length:int = myList.dataProvider.length; 
     var oldItem:Object; 
     for(var i:int = 0; i < length; i++) { 
      oldItem = myList.dataProvider.getItemAt(i); 
      if(oldItem.isChecked) { 
       oldItem.isChecked = false; 
       myList.dataProvider.itemUpdated(oldItem); 
       break; 
      } 
     } 

     //select new one 
     item.isChecked = true; 
     myList.dataProvider.itemUpdated(item); 
    } 

    //pop view 
    navigator.popView(); 
} 

私はapperentlyレンダラーがそれがeverthingを再描画しなければならないと考えて、なぜ...、なぜビューが再び示された後にのみ、私は見当がつかない、問題がmyList.dataProvider.itemUpdated(oldItem)であると思います...?

これはバグなのですか?どのように私はこのbahaviorを取り除くことができますか、またはこれを正しくデバッグするには?ありがとう

+0

速いもの; dataProviderでitemUpdatedを呼び出すと、itemRendererでdataChangeイベントが発生します。 itemUpdated関数を呼び出す唯一の理由として、コンポーネントを再描画するよう強制することが期待されます。しかし、あなたのコードにdataChangeイベントハンドラがないので、私は不明です。 – JeffryHouser

+0

itemUpdated()を呼び出すと、itemRendererは新しいチェックマークイメージを作成するか、古いチェックマークイメージを削除することができます。実際には、それを再描画する必要があります。 ItemRendererでは、元の最適化されたimemRenderersが同じように機能するため、set data()メソッドを使用せず、commitProperties()メソッドを使用します。しかし、それでもitemUpdated()を呼び出すと、リスト全体ではなく、1つのリスト項目だけを再描画します。 – MorbZ

+0

しかし大きな問題は、スクロールを開始するときにリストが再描画されるのはなぜですか? – MorbZ

答えて

2

私はそれを得ました!

私はなぜ知らないが、私は

IconItemRendererのLayoutContents方法で
setElementPosition(checkMarkImage, w-40, 14); 

checkMarkImage.x = w-40; 
checkMarkImage.y = 14; 

を交換する際に、すべてが正常に動作します。

関連する問題