actionscript 3 - Spark images in spark list with TileLayout disappear on scroll and drag in Flex app -


i have renderer looks this:

<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"                  autodrawbackground="true">     <s:group width="160" tooltip="{data.tooltip}" doubleclickenabled="true">         <s:layout>             <s:verticallayout gap="5" horizontalalign="center"                               paddingbottom="2" paddingleft="2" paddingright="2" paddingtop="2"/>         </s:layout>         <mx:canvas width="156" height="156" borderstyle="solid" bordercolor="#aaaaaa"                    verticalscrollpolicy="off" horizontalscrollpolicy="off">             <mx:image id="image" source="{data.thumbnail}" width="{data.thumbwidth}" height="{data.thumbheight}"                       horizontalcenter="0" verticalcenter="0"/>         </mx:canvas>         <s:label text="{data.data.name}" maxdisplayedlines="2" textalign="center"                   width="100%"/>     </s:group> </s:itemrenderer> 

in list looks this

<s:list id="fileiconview"     dataprovider="{files}"     width="100%" height="100%"     bordervisible="false"     dragenabled="true"      allowmultipleselection="true"      doubleclickenabled="true"     mousedown="fileiconviewmousedown(event)"     mousemove="fileiconviewmousemove(event)"     mouseup="clearselectionrectangle()"     change="fileselectionchanged()"     itemrenderer="view.thumbnailrenderer">     <s:layout>         <s:tilelayout clipandenablescrolling="true" />     </s:layout> </s:list> 

when scroll images in list disappear. how fix this?

the same happens when drag 1 of them fixed (partially) regenerating list when drag completed or cancelled.

update july 11, 2011, 2:02pm est data object being sent renderer looks this

[bindable] public class filewrapper {     /** file wrapper holds, file, onlinedocument , symboliclinks */     public var data:*;      /** file size */     public var size:string;      /** file's author */     public var author:string;      /** file's created date */     public var date:string;      /** tooltip file  */     public var tooltip:string;      /** image */     public var img:string;      /** thumbnail source */     public var thumbnail:object;      /** width of thumbnail image */     public var thumbwidth:int;      /** height of thumbnail image */     public var thumbheight:int;      /** folder mime type icons */     public const mime_icons_folder:string = "fileexplorer/mimetypeicons/";      public function filewrapper(file:*, controller:fileexplorercontroller)     {         this.data = file;          if (file file) {             var f:file = file file;             this.size = numberutils.humanreadablebytes(f.latestrevision.sizeondisk);             this.author = f.latestrevision.author.displayname;             this.date = numberutils.formatdate(f.latestrevision.timeuploaded);             this.tooltip = f.name + "\n" +"size: " + this.size                 + "\n" + "type: " + f.latestrevision.mimetype;             this.img = mime_icons_folder+getmimetypeicon(f.latestrevision.mimetype);              var self:filewrapper = this;             controller.getthumbnail(f.latestrevision,                 function (tumbnailbitmap:object):void                 {                     self.thumbnail = tumbnailbitmap;                     self.thumbwidth = tumbnailbitmap.width;                     self.thumbheight = tumbnailbitmap.height;                 });         }         else if(file onlinedocument) {             this.tooltip = file.name + "\nonline document";             this.img = mime_icons_folder+"onlinedocument.png";         }         else if(file symbolicfilelink) {             this.tooltip = file.name + "\nshortcut";             this.img = mime_icons_folder+"system-shortcut-icon.png";         }         else {             this.size = "";             this.author = "";             this.date = "";             this.tooltip = "unknown file type";             this.img = mime_icons_folder+"unknown.png";         }         this.thumbnail = this.img;         this.thumbwidth = 32;         this.thumbheight = 32;     }      /**      * gets icon image given mime type      *       * @param mime type string      * @return image name string      */     protected static function getmimetypeicon(mimetype:string):string     {         switch (mimetype) {             case "application/msword":                 return "file-doc.png";             case "application/octet-stream":                 return "system-binary.png";             case "application/ogg":                 return "audio-ogg.png";             case "application/pdf":                 return "file-pdf.png";             case "application/vnd.ms-excel":                 return "file-xls.png";             case "application/vnd.ms-powerpoint":                 return "file-ppt.png";             case "application/x-bzip2":                 return "archive-zip.png";             case "application/x-gtar":                 return "archive-tar.png";             case "application/x-gzip":                 return "archive-gzip.png";             case "application/x-tar":                 return "archive-tar.png";             case "application/xhtml+xml":                 return "file-html.png";             case "application/zip":                 return "archive-zip.png";             case "audio/x-mpegurl":                 return "audio-mp3.png";             case "audio/mpeg":                 return "audio-mp3.png";             case "audio/x-aiff":                 return "audio-aiff.png";             case "audio/x-wav":                 return "audio-wav.png";             case "image/bmp":                 return "image-bmp.png";             case "image/gif":                 return "image-gif.png";             case "image/jpeg":                 return "image-jpg.png";             case "image/png":                 return "image-png.png";             case "image/tiff":                 return "image-bmp.png";             case "text/html":                 return "file-html.png";             case "text/plain":                 return "file-txt.png";             case "application/vnd.oasis.opendocument.presentation":                 return "presentation.png";             case "application/vnd.oasis.opendocument.spreadsheet":                 return "spreadsheet.png";             case "application/vnd.oasis.opendocument.text":             case "text/richtext":                 return "text.png";             case "text/xml":                 return "text.png";             case "video/mpeg":                 return "video-mpeg.png";             case "video/quicktime":                 return "video-movie.png";             case "video/vnd.mpegurl":                 return "video-mpeg.png";             case "video/x-msvideo":                 return "video-avi.png";             case "video/x-sgi-movie":                 return "video-movie.png";             default:                 return "system-default.png";         }     } } 

the controller.getthumbnail method calls model method

public function getthumbnail(revision:revision, callback:function):void {     // image revisions     if (revision.mimetype.indexof("image") > -1) {         var loader:loader = new loader();         // create request         var urlvars:urlvariables = new urlvariables();         urlvars.authtoken = useraccountmodel.token;         urlvars.id = revision.id;         var req:urlrequest = new urlrequest(thumbnail_url);         req.data = urlvars;          var context:loadercontext = new loadercontext(true);         loader.load(req, context);         // set load handler         loader.contentloaderinfo.addeventlistener(event.complete,             function(event:event):void             {                 callback(event.currenttarget.content);             });     } } 

loading thumbnails using method works perfectly. issue happens when scroll list.

my first suspicion when seeing "usevirtuallayout" issue. summarize, renderer can re-used when usevirtuallayout true, default. when renderer gets reused may decide data hasn't changed, , incorrectly render things such images.

the 2 solutions have used ensure accurate rendering are: first, turn usevirtuallayout false. prevents re-use of renderer. second, override set data function , create own private variables hold data displaying. allow more debug setting of data, , ensure data being set correctly every time renderer used/re-used.

one final note. may totally unrelated, noticed particular problem occurred less after updating flash player 10.3.


Comments

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -