2012-02-29 3 views
1

Я отчаянно пытаюсь исправить странное поведение в своем списке избранных значков: Когда я меняю представление на представление со списком внутри и начинаю прокрутку, список становится белым для фракции второй (полностью полностью перерисованный), но только один раз при прокрутке в первый раз после изменения вида.Flex Mobile: странное поведение в списке IconItemRenderer

В 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(); 
} 

Я думаю, что проблема в myList.dataProvider.itemUpdated (oldItem), apperently визуализатор считает, что нужно перерисовывать Everthing, но я понятия не имею, почему .. и почему только после того, как вид показан еще раз ...?

Любые идеи, если это ошибка или что-то еще? как я могу избавиться от этого бхасиуса или как я могу отлаживать это правильно? спасибо

+0

Быстрый; но вызов itemUpdated на dataProvider заставит событие dataChange срабатывать в itemRenderer. Я бы ожидал, что это заставит компонент перерисовывать - поскольку это единственная причина вызвать функцию itemUpdated. Но я не вижу обработчика событий dataChange в вашем коде, поэтому я не знаю. – JeffryHouser

+0

Вызов itemUpdated() itemRenderer может либо создать новое изображение галочки, либо удалить старый, так что на самом деле он должен перерисовываться. В ItemRenderer я не использую метод set data(), а метод commitProperties(), поскольку исходные оптимизированные imemRenderers делают то же самое. Но тем не менее, вызывая itemUpdated(), я хочу, чтобы только отдельные элементы списка перерисовывали, а не весь список. – MorbZ

+0

Но большой вопрос: почему список перерисовывается, когда я начинаю прокрутку, это не обязательно – MorbZ

ответ

2

Я понял!

Я не знаю, почему, но когда я заменить

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

с

setElementPosition(checkMarkImage, w-40, 14); 

в методе LayoutContents в IconItemRenderer, все работает отлично.

Смежные вопросы