Flex Mobile: странное поведение в списке IconItemRenderer

Я отчаянно пытаюсь исправить странное поведение в моем пользовательском списке 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), по-видимому, средство визуализации думает, что ему нужно что-то перерисовывать, но я понятия не имею, почему ... и почему только после того, как представление отображается снова ...?

Есть идеи, если это ошибка или что-то в этом роде? как я могу избавиться от этого поведения или как я могу его правильно отладить? Благодарность


person Community    schedule 29.02.2012    source источник
comment
Быстрый; но вызов itemUpdated в dataProvider приведет к срабатыванию события dataChange в itemRenderer. Я ожидал, что это заставит компонент перерисовать - поскольку это единственная причина для вызова функции itemUpdated. Но я не вижу в вашем коде обработчика события dataChange, поэтому я не понимаю.   -  person JeffryHouser    schedule 29.02.2012
comment
Вызывая itemUpdated (), itemRenderer может либо создать новое изображение галочки, либо удалить старое, поэтому на самом деле его придется перерисовать. В ItemRenderer я использую не метод set data (), а метод commitProperties (), поскольку исходные оптимизированные imemRenderers делают то же самое. Но тем не менее, вызывая itemUpdated (), я хочу, чтобы перерисовывались только отдельные элементы списка, а не весь список.   -  person    schedule 29.02.2012
comment
Но большой вопрос: почему список перерисовывается, когда я начинаю прокручивать, в этом нет необходимости.   -  person    schedule 01.03.2012
comment
У меня проблемы с пониманием кода, потому что похоже, что вы предоставили только фрагменты. Насколько я понимаю, все перерисовывается при первой прокрутке. B / c начальный цикл в обработчике изменений сообщает каждому элементу о необходимости перерисовки. Когда увольняется обработчик изменений? Из списка или из рендерера? Я думаю, вам нужно предоставить работоспособный образец для демонстрации проблемы для достижения наилучших результатов здесь.   -  person JeffryHouser    schedule 01.03.2012
comment
Я создал новое приложение, в которое просто добавил необходимые части. По какой-то причине такое поведение не воспроизводится. Уже второй день я пытаюсь решить проблему, которая длится всего доли секунды в последнем приложении -.-   -  person    schedule 01.03.2012
comment
Я понял! Не знаю почему, но когда я заменил checkMarkImage.x = w-40; checkMarkImage.y = 14; с setElementPosition (checkMarkImage, w-40, 14); в методе LayoutContents объекта IconItemRenderer все работает нормально.   -  person    schedule 01.03.2012
comment
Отправьте это как официальный ответ и выберите его как правильный. Не просматривая [и сравнивая] код свойств x / y и setElementPosition; Я не уверен, почему один вызывает проблемы, а другой - нет.   -  person JeffryHouser    schedule 01.03.2012


Ответы (1)


Я понял!

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

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

с участием

setElementPosition(checkMarkImage, w-40, 14);

в методе LayoutContents объекта IconItemRenderer все работает нормально.

person Community    schedule 01.03.2012