我使用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。
我该如何解决这个问题?任何帮助将不胜感激。感谢
答案 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的属性更改事件进行渲染器更新