Reputation: 1197
I have a list of files and directories but there is no organization to the list. I want to sort them with the directories listed first alphabetically, then the files. How can I accomplish this?
private void fill(File[] files) {
this.directoryEntries.clear();
// and the ".." == 'Up one level'
if(this.currentDirectory.getParent() != null && !this.currentDirectory.equals("/sd card"))
this.directoryEntries.add(new IconifiedText(
getString(R.string.up_one_level),
getResources().getDrawable(R.drawable.uponelevel)));
Drawable currentIcon = null;
for (File current_File : files){
if (current_File.isDirectory()) {
currentIcon = getResources().getDrawable(R.drawable.folder);
}else{
String fileName = current_File.getName();
/* Determine the Icon to be used,
* depending on the FileEndings defined in:
* res/values/fileendings.xml. */
if(checkEndsWithInStringArray(fileName, getResources().
getStringArray(R.array.fileEndingJs))){
currentIcon = getResources().getDrawable(R.drawable.mimejs);
}else if(checkEndsWithInStringArray(fileName, getResources().
getStringArray(R.array.fileEndingHTML))){
currentIcon = getResources().getDrawable(R.drawable.mimehtml);
}else if(checkEndsWithInStringArray(fileName, getResources().
getStringArray(R.array.fileEndingCSS))){
currentIcon = getResources().getDrawable(R.drawable.mimecss);
}else if(checkEndsWithInStringArray(fileName, getResources().
getStringArray(R.array.fileEndingXML))){
currentIcon = getResources().getDrawable(R.drawable.mimexml);
}else if(checkEndsWithInStringArray(fileName, getResources().
getStringArray(R.array.fileEndingPhp))){
currentIcon = getResources().getDrawable(R.drawable.mimephp);
}else{
currentIcon = getResources().getDrawable(R.drawable.mimetxt);
}
}
switch (this.displayMode) {
case ABSOLUTE:
/* On absolute Mode, we show the full path */
this.directoryEntries.add(new IconifiedText(current_File
.getPath(), currentIcon));
break;
case RELATIVE:
/* On relative Mode, we have to cut the
* current-path at the beginning */
int currentPathStringLenght = this.currentDirectory.getAbsolutePath().length();
this.directoryEntries.add(new IconifiedText(
current_File.getAbsolutePath().
substring(currentPathStringLenght),
currentIcon));
break;
}
}
Collections.sort(this.directoryEntries);
itla.setListItems(this.directoryEntries);
this.setListAdapter(itla);
}
Upvotes: 1
Views: 2687
Reputation: 948
Write a Comparator that sorts by isDirectory()
class FileTypeComparator implements Comparator<File> {
@Override
public int compare(File file1, File file2) {
if (file1.isDirectory() && file2.isFile())
return -1;
if (file1.isDirectory() && file2.isDirectory()) {
return 0;
}
if (file1.isFile() && file2.isFile()) {
return 0;
}
return 1;
}
}
And another one that sorts by getName()
class FileNameComparator implements Comparator<File> {
@Override
public int compare(File file1, File file2) {
return String.CASE_INSENSITIVE_ORDER.compare(file1.getName(),
file2.getName());
}
}
Then use Guavas Ordering.compound(Comparator comparator2) to combine the two Comparators
Collections.sort(files,Ordering.from(new FileTypeComparator()).compound(new FileNameComparator()));
Upvotes: 5