0

我使用 flex sdk 4.5 来创建 Adob​​e Air 应用程序。我的应用程序一个一个地下载文件。我在 spark 列表中显示当前正在下载、待处理和已完成的文件。我使用了显示文件进度和其他状态的项目渲染器。

如果所选文件适合当前视图,则它可以正常工作。但随着下载次数的增加,Spark 列表显示垂直滚动。在这里我有问题。这里的文件下载功能工作正常,但如果我尝试滚动列表,文件标题会混淆或显示无序。

项目渲染器代码:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
  xmlns:s="library://ns.adobe.com/flex/spark" 
  xmlns:mx="library://ns.adobe.com/flex/mx"
  creationComplete="onInit()"
  >

  <fx:Script><![CDATA[
    import com.streamingnetworks.hdvrwin.vo.DownloadInfo;

    import mx.events.CloseEvent;

    [Bindable]private var downloadInfo:DownloadInfo;
    private var url:String = "";
    private var fileName:String = "";

    private function onInit():void
    {
      downloadInfo = data as DownloadInfo;
      downloadInfo.addEventListener("Progress", onProgress);
      downloadInfo.addEventListener("DownloadComplete", onComplete);
      prog.label = "Downloading %3%%";
      lblPath.text = " - " + downloadInfo.getPathIp();
      trace("Downloading: " + downloadInfo.name);
    }

    private function onProgress(e:Event):void
    {
      prog.setProgress(downloadInfo.downloadedBytes, downloadInfo.totalBytes);
      lblState.text = downloadInfo.getDownState();
    }

    private function onComplete(e:Event):void
    {
      prog.label = "Download Complete";
    }

    protected function onClose(event:CloseEvent):void
    {      
      downloadInfo.state = "deleted"
    }

  ]]></fx:Script>

  <s:TitleWindow top="0" left="0" right="0" bottom="0" dropShadowVisible="false"
    title="{'Downloading ' + downloadInfo.name}" close="onClose(event)">
    <mx:ProgressBar id="prog" label="" mode="manual" 
      trackHeight="20" labelPlacement="center" width="100%"/>
    <s:HGroup top="25">
      <s:Label id="lblState" text="Downloading 0 Bytes of 0 Bytes."/>
      <s:Label id="lblPath"/>
    </s:HGroup>
  </s:TitleWindow>

</s:ItemRenderer>

这里是我使用该渲染器的列表控件

<s:List id="lstControls" dataProvider="{urlArr}"
    itemRenderer="ItemRenderer"
    left="5" right="5" bottom="5" top="40"/>

urlArr 是一个 arrayList,它只包含字符串形式的 url。

我怎么解决这个问题?任何帮助将不胜感激。谢谢

4

2 回答 2

2

您的渲染器没有正确更新,因为您在创建渲染器时设置了数据 - 但您应该覆盖 set data 方法,例如:

override public function set data(value:Object):void
{
    super.data = value;
    downloadInfo = data as DownloadInfo;
    downloadInfo.addEventListener("Progress", onProgress);
    downloadInfo.addEventListener("DownloadComplete", onComplete);
    prog.label = "Downloading %3%%";
    lblPath.text = " - " + downloadInfo.getPathIp();
    trace("Downloading: " + downloadInfo.name);
}

并移除 creationComplete 监听器。

于 2013-05-13T12:43:37.580 回答
1

作为一种更好的做法。在数据提供程序中准备好进度条所需的所有数据,并让它们仅对数据的更改做出反应。在内部添加和删除侦听器和绑定只会让您感到悲伤。渲染器不会永远存在,而是在列表组件中重复使用。通过覆盖 set data() 来管理所有内容。

在此示例中,我将创建一个模型对象,其名称如 FileDownloadInfo 和属性如 .downloadProgress .fileName 和 .ipAddress 然后让渲染器更新 .downloadProgress 的属性更改事件

于 2013-05-14T14:24:20.820 回答