我有FileSystemList这显然列出了指定目录中的文件。一切都很好,除了我想根据文件的创建日期对列表进行排序。
这可能是FileSystemList
吗?
答案 0 :(得分:1)
开箱即用,您只能通过nameCompareFunction
属性按文件名排序。不幸的是,FileSystem *控件的API没有很好地设计用于可扩展性或自定义。事情就变成了一点点"更复杂,您必须从FileSystemList
派生:
com.stackoverflow.MyFileSystemList
package com.stackoverflow
{
import mx.controls.FileSystemList;
import mx.core.mx_internal;
use namespace mx_internal;
public class MyFileSystemList extends FileSystemList
{
public function MyFileSystemList()
{
super();
// overwrite the FileSystemControlHelper instance
helper = new MyFileSystemControlHelper(this, false);
iconFunction = helper.fileIconFunction;
labelFunction = helper.fileLabelFunction;
directory = COMPUTER;
}
public function set fileCompareFunction(value:Function): void
{
MyFileSystemControlHelper(helper).fileCompareFunction = value;
}
public function get fileCompareFunction():Function
{
return MyFileSystemControlHelper(helper).fileCompareFunction;
}
}
}
com.stackoverflow.MyFileSystemControlHelper
package com.stackoverflow
{
import mx.controls.fileSystemClasses.FileSystemControlHelper;
import mx.core.mx_internal;
use namespace mx_internal;
public class MyFileSystemControlHelper extends FileSystemControlHelper
{
public function MyFileSystemControlHelper(owner:Object, hierarchical:Boolean)
{
super(owner, hierarchical);
directoryEnumeration = new MyDirectoryEnumeration();
}
private var _customFileCompareFunction:Function;
private var customFileCompareFunctionChanged:Boolean = false;
public function set fileCompareFunction(value:Function): void
{
_customFileCompareFunction = value;
customFileCompareFunctionChanged = true;
owner.invalidateProperties();
}
public function get fileCompareFunction():Function
{
return _customFileCompareFunction;
}
override public function commitProperties():void
{
super.commitProperties();
if (customFileCompareFunctionChanged)
{
MyDirectoryEnumeration(directoryEnumeration).customFileCompareFunction = fileCompareFunction;
directoryEnumeration.refresh();
owner.dataProvider = directoryEnumeration.collection;
itemsChanged();
customFileCompareFunctionChanged = false;
}
}
}
}
com.stackoverflow.MyDirectoryEnumeration
package com.stackoverflow
{
import flash.filesystem.File;
import mx.utils.DirectoryEnumeration;
import mx.utils.DirectoryEnumerationMode;
public class MyDirectoryEnumeration extends DirectoryEnumeration
{
public function MyDirectoryEnumeration(source:Array = null)
{
super(source);
}
private var _fileCompareFunction:Function;
public function get customFileCompareFunction(): Function
{
return _fileCompareFunction;
}
public function set customFileCompareFunction(value: Function):void
{
_fileCompareFunction = value;
}
override public function fileCompareFunction(file1:File, file2:File, fields:Array=null):int
{
if (_fileCompareFunction == null)
return super.fileCompareFunction(file1, file2, fields);
if (file1.isDirectory && !file2.isDirectory)
{
if (enumerationMode == DirectoryEnumerationMode.DIRECTORIES_FIRST)
return -1;
if (enumerationMode == DirectoryEnumerationMode.FILES_FIRST)
return 1;
}
if (!file1.isDirectory && file2.isDirectory)
{
if (enumerationMode == DirectoryEnumerationMode.DIRECTORIES_FIRST)
return 1;
if (enumerationMode == DirectoryEnumerationMode.FILES_FIRST)
return -1;
}
return _fileCompareFunction(file1, file2);
}
}
}
之后,您可以使用MyFileSystemList
组件并提供自己的比较功能,以根据创建日期对文件进行排序:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:stackoverflow="com.stackoverflow.*">
<stackoverflow:MyFileSystemList fileCompareFunction="compareFiles"/>
<fx:Script><![CDATA[
private function compareFiles(file1:File, file2:File):int
{
if (file1.creationDate.time > file2.creationDate.time)
return 1;
else
return -1;
}
]]></fx:Script>
</s:WindowedApplication>