【问题标题】:Flex 4.5: Refresh only when app is opening and click buttonFlex 4.5:仅在应用打开并单击按钮时刷新
【发布时间】:2012-02-13 16:04:25
【问题描述】:

我根据教程之一开发了小型 RSS 阅读器。这是一个在 HomeView 上的简单应用程序,当用户单击 RSS 项目的标题时,然后在 DetailsView.mxml 上应用程序推送视图。但我有一个小问题。我在 HomeView 上包含一个刷新按钮,但每次我在列表上滚动或单击项目然后返回 HomeView 列表时都会刷新。这使用了大量的互联网连接。是否可以制作此应用程序,以便在应用程序打开时加载(刷新)列表,然后仅使用“刷新”按钮刷新?

附:拜托,我需要简单的解释,我不是程序员:)

感谢您的帮助,这里是 HomeView 的源代码:

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:rssreader="services.rssreader.*"
        xmlns:s="library://ns.adobe.com/flex/spark"
        title="Elektro-Vozila" viewActivate="getData()">

    <fx:Script>
        <![CDATA[
            import spark.events.IndexChangeEvent;

            protected function getData():void
            {
                getDataResult.token = rssreader.getData();
            }

            import mx.events.CollectionEvent;
            import valueObjects.Item;

            protected function fixEntityReferences(event:CollectionEvent):void
            {
                myList.labelFunction = replaceEntity;

                function replaceEntity(item:Item):String
                {
                    var p1:RegExp = /(&quot;)/ig; // perhaps add more here later
                    var thisString:String = item.title.replace(p1, "");
                    trace(thisString);
                    return thisString;

                }
            }

            protected function myList_changeHandler(event:IndexChangeEvent):void
            {

                var RSSItem:Object = myList.dataProvider.getItemAt(event.newIndex);
                navigator.pushView(DetailsView, RSSItem);
            }

            private function refreshList():void

            {

                    Object(navigator.activeView).getData();  

            }
        ]]>

    </fx:Script>
    <s:actionContent>
        <s:Button label="Refresh"
                  click="refreshList()"/>
    </s:actionContent>
    <fx:Declarations>
        <s:CallResponder id="getDataResult"/>
        <rssreader:Rssreader id="rssreader"/>
        <s:CallResponder id="getDataResult2"/>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:List bottom="0"
            change="myList_changeHandler(event)"
            id="myList"
            itemRenderer="views.IconItemRenderer"
            labelField="title"
            left="0"
            right="0"
            top="0">
        <s:AsyncListView list="{getDataResult.lastResult}"
                         collectionChange="fixEntityReferences(event)"/>

    </s:List>
</s:View>

【问题讨论】:

    标签: actionscript-3 apache-flex flex4.5 flexbuilder


    【解决方案1】:

    嗨,罗基,

            private var dataLoaded : Boolean = false;
    
            protected function getData(force : Boolean = false) : void
            {
                if (!dataLoaded || force)
                {
                    getDataResult.token = rssreader.getData();
                    dataLoaded = true;
                }
            }
    

    在刷新按钮中,即使数据已经加载,您也可以调用 getData(true) 强制刷新。

    【讨论】:

    • Heeey Shaun “好人” :)) 我对这段代码有一个错误。上线“protected function getData(force: Boolean = false): void”错误为:1021: Duplicate function definition.
    • 您必须已粘贴但未替换现有的。 AS3 不允许重载方法,这是您告诉它要做的。重载是指您有不同的“签名”,也就是说方法调用的数据类型不同但方法名称相同。 AS3 不允许您这样做,因此您只需将其粘贴到现有方法上……或者现在您有两个删除旧方法。
    • 很高兴我还有源代码:)
    • 嗯,我替换了代码,但是当我在列表(第一个视图)上滚动时,仍然必须打开数据连接。当我在使用应用程序(仅在列表上滚动)期间启动数据连接或 wi-fi 时,图像不显示。
    • 这实际上是预期的行为。 Flex 中的列表类型显示对象使用称为项目渲染器回收的东西来避免创建与数据提供程序中的元素一样多的 UIComponent。基本上,屏幕外的东西在出现在屏幕上之前不会被创建。如果您希望它最初缓存所有图像,则必须“手动”处理它,以便将它们存储在内存中以供使用,而不是即时获取。这应该不会太难,但需要一些自定义代码,我会看看我能做什么。
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 2014-04-07
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2014-12-25
    相关资源
    最近更新 更多