Búsqueda recursiva de archivos de Android

¿Puede alguien señalar qué está yendo mal aquí?

El siguiente código recorre los directorios en /sdcard. Si encuentra un archivo, agrega el nombre, etc. a una matriz. Si encuentra un directorio, entra y lo escanea.

system.out devuelve todos los archivos en /sdcard.

El adaptador de matriz solo enumera lo que encuentra en el directorio de nivel superior

En mi tarjeta SD, espero que devuelva dos archivos mp3, uno en el directorio de nivel superior y otro enterrado dentro del árbol. La línea system.out encuentra ambos.

Sospecho que la lista de arreglos fls está siendo destruida. Si es así, ¿cómo hago para preservar esto?

Gracias de antemano!

 public void fill(File f) {     
        File[]files = f.listFiles();
          List<Option>fls = new ArrayList<Option>();
          if (files != null) {
                for(File ff: files){
                    if(!ff.isDirectory())
                        {
                        /** Only Add MP3's to the list    */
                        String filename=ff.getName();
                        String ext = filename.substring(
                                    filename.lastIndexOf('.')+1, filename.length());
                                           if(ext.equals("MP3")||ext.equals("mp3")||ext.equals("Mp3")||ext.equals("mP3"))
                        fls.add(new Option(ff.getName(),"File Size: "+ff.length()/1048576 + "MB",ff.getAbsolutePath()));
                        System.out.println( ff.getName() );
                        }
                    else
                        fill(ff);
               }    
          }

        Collections.sort(fls);
        adapter = new FileArrayAdapter(getActivity(),R.layout.folder_view,fls);
        this.setListAdapter(adapter);   
        }

preguntado el 12 de junio de 12 a las 22:06

1 Respuestas

Con el código tal como está, la lista de arreglos se volverá a crear cada vez que ingrese una nueva carpeta, debe quitar el código del adaptador de la función y hacer que la función de relleno tome la lista de arreglos como un parámetro para que cada llamada tome la misma lista de arreglos.

es decir.

List<Option>fls = new ArrayList<Option>();

fill(f,fls);

Collections.sort(fls);
adapter = new FileArrayAdapter(getActivity(),R.layout.folder_view,fls);
this.setListAdapter(adapter); 

si desea reducirlo a una sola llamada (que no recomiendo), puede hacerlo

fill(f,null);

y en la función de relleno, verifique si el arraylist es nulo, si lo está, inicialícelo, pero aún debe pasarlo a llamadas adicionales.

Respondido el 12 de junio de 12 a las 22:06

Hola, gracias por la respuesta. Hice el cambio, así que ahora funciona como esperaba. Sin embargo, es bastante lento en el nivel de la carpeta superior, donde está escaneando efectivamente toda la tarjeta SD. Se tarda unos 20 segundos en construir la lista. ¿Alguna sugerencia para optimizar esto? Simplemente puedo pegar esta función en un botón o una acción de presión prolongada, a menos que pueda optimizarse significativamente. - Sr. Adam

La única optimización que se me ocurre es hacer que verifiques la extensión del archivo un poco diferente. Por, if(ff.getName().toLowerCase().endsWith("mp3"); pero necesitaría probar para ver la diferencia de velocidad. Lo más probable es que necesite implementar esto en una especie de tarea asíncrona, dudo que pueda sea ​​lo suficientemente rápido como para no necesitar informar al usuario. Jug6ernaut

oh bien, eso ordena el código al menos, así que lo dejaré caer de todos modos. Lo tengo configurado para omitir directorios ocultos, así como una lista de directorios estándar (DCIM, etc.) para omitir. La alternativa es pedirle al usuario que seleccione una carpeta y la almacene. Habiendo dicho todo eso, toda la música está dentro de mi carpeta /Música, y eso lleva tanto tiempo escanear como el nivel anterior, ¡así que eso no ayudará! - Sr. Adam

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.