ListにitemRenderer
前回のAIRでディレクトリ選択ダイアログで、ディレクトリ内のファイルをListに表示させたんですが、
var files:Array = directory.getDirectoryListing();す var filenames:ArrayCollection = new ArrayCollection(); for (var i:uint = 0; i < files.length; i++) { filenames.addItem(files[i].name); } fileList.dataProvider = filenames;
というように、Fileクラスの配列から、ファイル名の配列を作りなおしました。
これはFileクラスの配列をそのまま渡すと、こんな感じでファイル名の表示ができないからでした。
でも、せっかく取得したFileクラスの配列があるのに、それを捨てて別の配列を作るのが気に入らなかったので、別の方法を考えていたらitemRendererというものがあることを知りました。
で、itemRendererをつかった書き直したコードが以下です。
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; private var directory:File = File.documentsDirectory; private function initApp():void { directory.addEventListener(Event.SELECT, directorySelected); } private function onClick():void { try { directory.browseForDirectory("Select Directory"); } catch (error:Error) { trace("Failed:", error.message) } } private function directorySelected(event:Event):void { directory = event.target as File; var files:Array = directory.getDirectoryListing(); fileList.dataProvider = files; } ]]> </mx:Script> <mx:Button label="open" click="onClick()"/> <mx:List id="fileList" width="100%" height="100%"> <mx:itemRenderer> <mx:Component> <mx:Label text="{data.name}"/> </mx:Component> </mx:itemRenderer> </mx:List> </mx:WindowedApplication>
これだとFileクラスの配列をdataProviderにそのまま渡してもファイル名を表示してくれます。
ポイントは以下のようにitemRendererを使っているところです。
<mx:List id="fileList" width="100%" height="100%"> <mx:itemRenderer> <mx:Component> <mx:Label text="{data.name}"/> </mx:Component> </mx:itemRenderer> </mx:List>
これで、めでたしめでたし、と思ったのですが、ファイル名の配列を作りなおしたときに比べてスクロールが重い。。。
まぁ、とりあえず今回はこれで良し、としておくことにします。