Flex Mobile:IconItemRenderer列表中的奇怪行为

时间:2012-02-29 17:44:37

标签: actionscript-3 flex mobile itemrenderer flex4.6

我正在拼命尝试在我的自定义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)中,显然渲染器认为它必须重绘一次,但我不知道为什么......以及为什么只有在再次显示视图后...?

任何想法,如果它是一个错误或什么?我怎样才能摆脱这种行为或如何正确地调试这个?感谢

1 个答案:

答案 0 :(得分:2)

我明白了!

我不知道为什么,但当我更换

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

setElementPosition(checkMarkImage, w-40, 14);

在IconItemRenderer的LayoutContents方法中,一切正常。