在您的自定義單元格渲染器的構造函數,你需要一個事件偵聽器添加到受保護的裝載機實例和處理IO錯誤。
下面是一個例子:
package
{
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.ImageCell;
import fl.controls.TileList;
import fl.data.DataProvider;
import fl.managers.StyleManager;
import flash.events.EventDispatcher;
import flash.events.*;
import fl.containers.UILoader;
public class CustomImageCell extends ImageCell implements ICellRenderer
{
public function CustomImageCell()
{
super();
//do other stuff here
loader.scaleContent = false;
loader.addEventListener(IOErrorEvent.IO_ERROR, handleErrorEvent, false, 0, true);
useHandCursor = true;
}
override protected function drawLayout():void
{
var imagePadding:Number = getStyleValue("imagePadding") as Number;
loader.move(11, 5);
var w:Number = width-(imagePadding*2);
var h:Number = height-imagePadding*2;
if (loader.width != w && loader.height != h)
{
loader.setSize(w,h);
}
loader.drawNow(); // Force validation!
}
override protected function handleErrorEvent(event:IOErrorEvent):void {
trace('ioError: ' + event);
//dispatchEvent(event);
}
}
}
這裏是一個簡單的測試,我沒有看到,當數據提供商得到更新會發生什麼:
import fl.controls.*;
import fl.data.DataProvider;
import fl.controls.listClasses.CellRenderer;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var tileList:TileList = new TileList();
tileList.move(220,40);
tileList.setSize(215, 400);
tileList.columnWidth = 215;
tileList.rowHeight = 86;
tileList.direction = ScrollBarDirection.VERTICAL;
tileList.setStyle("cellRenderer", CustomImageCell);
addChild(tileList);
tileList.dataProvider = getRandomDP(10);
setTimeout(resetDP,3000);
function resetDP():void {
tileList.dataProvider = getRandomDP(10);
}
function getRandomDP(size:int):DataProvider {
var result:DataProvider = new DataProvider();
for(var i:int = 0; i < size; i++) result.addItem({label:'item'+i,source:'wrong.url/'+Math.random()});
return result;
}
HTH
我正是這樣做的。處理器在瓦片列表加載時捕獲IOErrors,但是如果我更改數據提供者,則會得到未處理的數據,就好像在數據提供者更改期間應該處理的加載器然後發送不再處理的IOErrorEvents,因爲加載器本身是不見了。 – WillyCornbread 2010-07-09 21:10:28
@WillyCornbread這就是你所說的改變數據提供者的意思嗎?在我的小測試中,即使數據提供者改變了,行爲也是一樣的。 – 2010-07-10 12:27:10
喬治 - 解決方案確實在你原來的答案。我將自己的IORErrorEvent處理程序添加到受保護的加載程序,但不覆蓋加載程序的受保護「handleErrorEvent」方法。一旦我使用了覆蓋,問題就停止了。非常感謝您的幫助。 – WillyCornbread 2010-07-10 19:45:06