Actionscript 3 Flex Mobile:列表闪烁

Actionscript 3 Flex Mobile:列表闪烁,actionscript-3,apache-flex,list,mobile,Actionscript 3,Apache Flex,List,Mobile,好的,我有一个列表,其中有一个IconItemRenderer。当我在AS3中设置它的dataprovider并开始滚动时,列表会闪烁一次(一帧变为白色)。仅当设置了messageField/messageFunction且消息区域中的行数不同时,才会发生这种情况。我确信这是一个框架错误。有人有过同样的经历吗?如果有人知道这方面的解决办法,我会很高兴。提前谢谢 下面是视图组件的示例代码。奇怪的是,闪烁似乎有时需要更多的时间,有时需要更少的时间。我在Android和桌面模式(adl)上测试了它,

好的,我有一个列表,其中有一个IconItemRenderer。当我在AS3中设置它的dataprovider并开始滚动时,列表会闪烁一次(一帧变为白色)。仅当设置了messageField/messageFunction且消息区域中的行数不同时,才会发生这种情况。我确信这是一个框架错误。有人有过同样的经历吗?如果有人知道这方面的解决办法,我会很高兴。提前谢谢


下面是视图组件的示例代码。奇怪的是,闪烁似乎有时需要更多的时间,有时需要更少的时间。我在Android和桌面模式(adl)上测试了它,两种模式都出现了错误。“blabla..”只是获取一个具有随机行数的字符串

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView">
    <s:actionContent>
        <s:Button label="Set List" click="btn_click(event)"/>
    </s:actionContent>
    <s:List width="100%" height="100%" id="list">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer messageField="text"/>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;

            protected function btn_click(event:MouseEvent):void
            {
                var al:ArrayList = new ArrayList;
                var obj:Object;
                var str:String = "blablablablablablablablablablablablablablablablablablablablabblablablablablablablablablablablablablablablablablablablablabblablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla";
                for(var i:int = 0; i < 20; i++) {
                    obj = new Object;
                    obj.text = str.substr(0, Math.random()*str.length);
                    al.addItem(obj);
                }
                list.dataProvider = al;
            }

        ]]>
    </fx:Script>
</s:View>


请参阅错误报告:


有关解决方法,请参见下面的正确答案。

我想我可能会为您提供一个解决方法。问题似乎与内容对齐有关,因此我尝试通过使用
contentJustify
设置自定义布局来更改默认对齐方式,而不是默认的
justify

<s:VerticalLayout gap="0" 
                  horizontalAlign="contentJustify" 
                  requestedMinRowCount="5" />
您可能希望正式提交此错误,但我不知道现在Flex从Adobe迁移到Apache后您必须在哪里提交此错误。

我也看到此问题(Flex 4.6+AIR 3.1),正如所述:当列表向任意方向拖动时,白色闪烁只发生一次。它不会发生在触摸上。在我的例子中,我甚至不使用Label/IconItemREnderer,而是基于这个漂亮的特性构建了一个定制的ItemRenderer
我的measure()方法根本不使用setElementSize()。当virtualLayout=false时,问题不会发生,对于数据提供程序中的大型(>200)元素,这在移动设备上是不可接受的。抱歉,还没有解决方法。

我最终找到了解决方法。基本上,当列表分派updateComplete事件时,它只是假装一个拖动事件。这可以防止在用户第一次开始滚动时闪烁,并且由于在最初显示列表之前调用了updateComplete,因此根本没有闪烁。积极的副作用是,每当您更改到包含此列表的视图时,或者当列表获得另一个数据提供程序时,滚动条会显示一段时间,因此您可以猜测列表有多大,而无需触摸它

这是代码。我将此列表用作我所有列表的超类:

import mx.events.FlexEvent;
import mx.events.TouchInteractionEvent;
import spark.components.List;

public class MyList extends List
{
    public function MyList()
    {
        super();

        //add event listeners
        addEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler);
    }

    //update complete
    protected function updateCompleteHandler(event:FlexEvent):void
    {
        //fake touch start
        fakeTouchEvent(TouchInteractionEvent.TOUCH_INTERACTION_START);
        callLater(endTouch);
    }

    //quit touch event
    protected function endTouch():void {
        //fake touch end
        fakeTouchEvent(TouchInteractionEvent.TOUCH_INTERACTION_END);
    }

    //fake touch event
    protected function fakeTouchEvent(type:String):void {
        var evt:TouchInteractionEvent = new TouchInteractionEvent(type);
        evt.relatedObject = scroller;
        scroller.dispatchEvent(evt);
    }
}

你怎么确定这是一个框架错误?您跟踪了错误的框架代码吗?找到问题的解决方案可能会有所帮助。请展示一些我们可以运行以演示问题的代码。还要提到哪个移动操作系统出现了问题。@RIAstar不,我还没有弄清楚错误代码,这就是为什么我在这里发布这个。我之所以不喜欢它,是因为它是特定于事件的,更难调试。@Flextras我在问题中添加了一个示例代码,我无法重现所描述的行为(桌面)。您是否尝试过创建一个单独的类来扩展
IconItemRenderer
?这应该比创建这样的内联组件对性能更好。谢谢你的回答。不过,我不能确认这是否有效。对我来说仍然有闪烁。@flex真的吗?这里一直很平稳。如果我删除
layout
标记和
horizontalScrollPolicy
属性,它将直接返回闪烁状态。不,不幸的是,它的行为与以前相同。我刚刚发现在列表中设置useVirtualLayout=false对我来说很好。尽管出于性能/内存方面的原因,我认为(更大的)移动列表是一个非常不令人满意的解决方案。如果你的解决方案对我有效,我更希望你的解决方案。@Flexx在我想出合理化解决方案之前,我尝试了
使用virtuallayout
:它对我无效。非常奇怪!顺便说一句,我使用的是Flex4.6:也许我们在这方面有所不同?@Flex-The-JIRA bug追踪器似乎已经移动到了
import mx.events.FlexEvent;
import mx.events.TouchInteractionEvent;
import spark.components.List;

public class MyList extends List
{
    public function MyList()
    {
        super();

        //add event listeners
        addEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler);
    }

    //update complete
    protected function updateCompleteHandler(event:FlexEvent):void
    {
        //fake touch start
        fakeTouchEvent(TouchInteractionEvent.TOUCH_INTERACTION_START);
        callLater(endTouch);
    }

    //quit touch event
    protected function endTouch():void {
        //fake touch end
        fakeTouchEvent(TouchInteractionEvent.TOUCH_INTERACTION_END);
    }

    //fake touch event
    protected function fakeTouchEvent(type:String):void {
        var evt:TouchInteractionEvent = new TouchInteractionEvent(type);
        evt.relatedObject = scroller;
        scroller.dispatchEvent(evt);
    }
}