Лучший способ конвертировать `File []` в `List <String>` - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь перечислить все папки в SDCard через ListAdapter. Но я получаю исключения во время выполнения @ 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);
}

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Вы можете сделать его немного короче, используя расширенный цикл for:

File[] sdDirectories = sd.listFiles(filterDirectoriesOnly);
for (File file : sdDirectories)
{
    item.add(file.getName() + "/");
}

Существует метод для непосредственного получения имен файлов , но они не будут иметь трейлинг /, и вы должны иметь возможность фильтровать по имени файла:

String[] fileNames = sd.list(fileNameFilter);
List<String> fileNamesList = Arrays.asList(fileNames);
1 голос
/ 24 февраля 2012

Вы получаете исключение во время выполнения. Причина

private Элемент списка = null;

никогда не инициализируется ..

, поэтому сначала инициализируйте, а затем добавьте..

То, что вы делаете, кажется правильным ... за исключением этой инициализации ..

0 голосов
/ 24 февраля 2012

Инициализируйте ваш список (отсюда и исключение).Но кроме этого, выглядит довольно хорошо для меня.Я имею в виду, по крайней мере, что бы я сделал.Единственное, что я бы порекомендовал, это то, что вы не создаете экземпляры переменных File sd и FileFilter filterdirectoriesOnly внутри функции, потому что я предполагаю, что вы будете вызывать ее снова и снова, когда пользователь нажимает на каталог и затем загружаетрезультаты для нового каталога.Таким образом, два объекта, которые я упомянул, одинаковы, но переинициализируются при каждом вызове.Вы можете просто переместить его наружу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...