我正在尝试通过ListAdapter列出sdcard中的所有文件夹。但我得到运行时异常@ item.add(file.getName() + "/");
。有没有更好的方法将File[]
转换为List<String>
?
private List <String> item = null;
String extState = Environment.getExternalStorageState();
if (!extState.equals(Environment.MEDIA_MOUNTED)) {
....
} else {
File sd = Environment.getExternalStorageDirectory();
FileFilter filterDirectoriesOnly = new FileFilter() {
public boolean accept(File file) {
return file.isDirectory();
}
};
File[] sdDirectories = sd.listFiles(filterDirectoriesOnly);
for (int i = 0; i < sdDirectories.length; i++) {
File file = sdDirectories[i];
item.add(file.getName() + "/");
}
ArrayAdapter <String> fileList = new ArrayAdapter <String>(this, R.layout.row, item);
setListAdapter(fileList);
}
答案 0 :(得分:1)
您将获得运行时异常暂停
private List item = null;
从未初始化..
首先初始化然后添加..
你做的事情似乎恰到好处..除了初始化..
答案 1 :(得分:1)
使用增强的for循环可以缩短它:
File[] sdDirectories = sd.listFiles(filterDirectoriesOnly);
for (File file : sdDirectories)
{
item.add(file.getName() + "/");
}
有一个method to get file names directly,但它们不会有您的结尾/
,您必须能够按文件名进行过滤:
String[] fileNames = sd.list(fileNameFilter);
List<String> fileNamesList = Arrays.asList(fileNames);
答案 2 :(得分:0)
初始化您的列表(因此异常)。但除此之外,对我来说看起来非常好。我的意思是,这至少是我要做的。我在这里唯一建议的是你不要在函数中重新实例化变量File sd
和FileFilter filterdirectoriesOnly
,因为我假设你会在用户点击时反复调用它目录然后加载新目录的结果。所以我提到的两个对象是相同的,但每次打电话时都会重新初始化。你可以把它移到外面。