项目渲染器在Spark列表中无法正常工作

时间:2013-05-13 12:30:07

标签: actionscript-3 flash flex flex4.5 itemrenderer

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

如果所选文件适合当前视图,则可以正常工作。但随着下载次数的增加,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是一个只包含字符串形式的url的arrayList。

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

2 个答案:

答案 0 :(得分:2)

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

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侦听器。

答案 1 :(得分:1)

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

在这个例子中,我将创建一个名为FileDownloadInfo的模型对象,以及.downloadProgress .fileName和.ipAddress等属性,然后对.downloadProgress的属性更改事件进行渲染器更新