Change the sort order
By default, the SD-card picker will display all files in alphabetical order. But what if you want a different sort-order?
You can override the sorting by overriding the compareFiles
-method:
@Override
protected int compareFiles(File lhs, File rhs) {
if (lhs.isDirectory() && !rhs.isDirectory()) {
return -1;
} else if (rhs.isDirectory() && !lhs.isDirectory()) {
return 1;
}
// This was the previous behaviour for all file-file comparisons. Now it's
// only done if the files have the same extension, or no extension.
else if (getExtension(lhs) != null && getExtension(lhs).equalsIgnoreCase(getExtension(rhs)) ||
getExtension(lhs) == null && getExtension(rhs) == null) {
return lhs.getName().compareToIgnoreCase(rhs.getName());
}
// Otherwise, we sort on extension placing files with no extension last.
else if (getExtension(lhs) != null && getExtension(rhs) != null) {
// Both have extension, just compare extensions
return getExtension(lhs).compareToIgnoreCase(getExtension(rhs));
} else if (getExtension(lhs) != null) {
// Left has extension, place it first
return -1;
} else {
// Right has extension, place it first
return 1;
}
}
Before and After
Full Fragment code
import com.nononsenseapps.filepicker.FilePickerFragment;
import java.io.File;
public class SortedFilePickerFragment extends FilePickerFragment {
/**
*
* @param file
* @return The file extension. If file has no extension, it returns null.
*/
private String getExtension(@NonNull File file) {
String path = file.getPath();
int i = path.lastIndexOf(".");
if (i < 0) {
return null;
} else {
return path.substring(i);
}
}
/**
* Compare two files to determine their relative sort order. This follows the usual
* comparison interface. Override to determine your own custom sort order.
*
* @param lhs File on the "left-hand side"
* @param rhs File on the "right-hand side"
* @return -1 if if lhs should be placed before rhs, 0 if they are equal,
* and 1 if rhs should be placed before lhs
*/
@Override
protected int compareFiles(File lhs, File rhs) {
if (lhs.isDirectory() && !rhs.isDirectory()) {
return -1;
} else if (rhs.isDirectory() && !lhs.isDirectory()) {
return 1;
}
// This was the previous behaviour for all file-file comparisons. Now it's
// only done if the files have the same extension, or no extension.
else if (getExtension(lhs) != null && getExtension(lhs).equalsIgnoreCase(getExtension(rhs)) ||
getExtension(lhs) == null && getExtension(rhs) == null) {
return lhs.getName().compareToIgnoreCase(rhs.getName());
}
// Otherwise, we sort on extension placing files with no extension last.
else if (getExtension(lhs) != null && getExtension(rhs) != null) {
// Both have extension, just compare extensions
return getExtension(lhs).compareToIgnoreCase(getExtension(rhs));
} else if (getExtension(lhs) != null) {
// Left has extension, place it first
return -1;
} else {
// Right has extension, place it first
return 1;
}
}
}