Como listar los archivos de un directorio con ListView y un ArrayAdapter Android
Hola de nuevo chic@s! En esta lección quiero poner el código que use en una aplicación que necesite listar el contenido de una carpeta, para que el usuario seleccionara un fichero (de ese listado) y devolviera la selección a la Activity principal de la que fue llamada.
En concreto, la aplicación tenia una opción para exportar a un fichero de texto el contenido de la base de datos, este fichero se guardaba poniendo como nombre la fecha en el que fue generada, con el fin de que si formateabas el teléfono, pudieras cargar la base de datos a partir de uno de esos ficheros con otra opción llamada "cargar base de datos". Pulsando ese botón se abrirá un listado con todos los ficheros o backups realizados que se contendrían en una ruta en el Almacenamiento Externo del teléfono. Cuando pulsaras sobre un fichero de ese listado, la aplicación volvería a la activity principal con el nombre del fichero seleccionado para hacer las acciones pertinentes.
Bueno voy a ir desgranando poco a poco el código que use, y finalmente te pondré la clase completa con el código que use para llamarla desde la activity principal ¿vale? pos adelanteeeeee!!!
1. Hacer el Array de texto con el contenido de ficheros de la carpeta Android
El primer paso que necesitas para hacer esto del listado, era hacer un array de tipo TEXTO que contenga el nombre de los ficheros que contiene la carpeta donde guardas los ficheros ¿por que? pos porque el ArrayAdapter que necesita el listado o ListView necesita que le pasemos un Array de tipo Texto.
Bueno pos vamos a hacer esto de Array!! el código que ves a continuación hace lo siguiente: Lo primero es definir el Array de texto donde iremos guardando los nombres de los ficheros, después se define la carpeta donde buscaremos los ficheros o carpetas que contenga, y por ultimo estableceremos un ciclo donde separaremos los directorios de los ficheros, a la vez que extraeremos el nombre del fichero para introducirlo en el array de texto que definimos al principio, todos estos datos los sacaremos de otro Array esta vez de tipo File donde se guarda todos los datos de los ficheros y directorios que contiene la carpeta que deseamos listar, esto lo conseguimos usando el método listFiles() analiza detenidamente este código.
// Array TEXTO donde guardaremos los nombres de los ficheros private List<String> item = new ArrayList(); //Defino la ruta donde busco los ficheros File f = new File(Environment.getExternalStorageDirectory() + "/MiBotiquin/"); //Creo el array de tipo File con el contenido de la carpeta File[] files = f.listFiles(); //Hacemos un Loop por cada fichero para extraer el nombre de cada uno for (int i = 0; i < files.length; i++) { //Sacamos del array files un fichero File file = files[i]; //Si es directorio... if (file.isDirectory()) item.add(file.getName() + "/"); //Si es fichero... else item.add(file.getName()); }
2. Hacer el ListView con el Array de texto con el contenido de la carpeta Android
Bueno, lo siguiente es hacer la lista en si, lo haremos con el control ListView y pasándole un adaptador de tipo ArrayAdapter al que le pasaremos como parámetro un array de tipo texto, por eso toda la historia del paso anterior.
Para hacer esta lista hemos usado un diseño de lista predefinida de Android, es decir, no necesitamos hacer un diseño para la lista personalizado, Android pone a nuestra disposición varios diseños "predefinimos" y así para este caso, nos ahorramos un diseño Layout para esto ;p.
Como resumen fíjate en las 3 primeras líneas, primero localizamos el control ListView dentro de nuestro layout, luego definimos el ArrayAdapter, fíjate que le pasamos como parámetros el contexto (this) el tipo de lista o dicho de otra forma, el diseño de cada fila de la lista (definimos un diseño predefinido de Android) y por ultimo le pasamos el Array de tipo texto (item). Hay mas información de este control en la lección de las listas.
//Localizamos y llenamos la lista con el array ListView lstOpciones = (ListView) findViewById(R.id.listaFiles); ArrayAdapterfileList = new ArrayAdapter (this, android.R.layout.simple_list_item_1, item); lstOpciones.setAdapter(fileList); // Accion para realizar al pulsar sobre un item de la lista lstOpciones.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterVew<?>a,View v,int position,long id){ //Devolvemos el resultado de la selección Intent data = new Intent(); data.putExtra("filename", item.get(position)); setResult(RESULT_OK, data); finish(); } });
Otra cosa a destacar de este punto es la parte en la que definimos la acción cuando pulsamos sobre los elementos de la lista, definimos un Listener con el SetOnItemClick, fíjate que lo que hacemos es pasarle a la Activity principal el nombre del fichero atraves del intent setResult.
Código completo para hacer el ListView con el contenido de la carpeta Android
Bueno, te dejo aquí la clase completa y todo el código que utilice para hacer esto, básicamente es lo que hemos visto por partes mas arriba, así que no lo veras raro! xD También te pongo el código de la llamada a esta clase desde la Activity principal.
Primero crea esta clase:
package es.epinanab.medicine; import java.io.File; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class ListaFilesActivity extends Activity { private List<String> item = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // para quitar titulo setContentView(R.layout.lista_files); item = new ArrayList<String>(); File f = new File(Environment.getExternalStorageDirectory() + "/MiBotiquin/"); File[] files = f.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; if (file.isDirectory()) item.add(file.getName() + "/"); else item.add(file.getName()); } //Mostramos la ruta en el layout TextView ruta = (TextView) findViewById(R.id.ruta); ruta.setText(Environment.getExternalStorageDirectory() + "/MiBotiquin/"); //Localizamos y llenamos la lista ListView lstOpciones = (ListView) findViewById(R.id.listaFiles); ArrayAdapter<String> fileList = new ArrayAdapter<String>this, android.R.layout.simple_list_item_1, item); lstOpciones.setAdapter(fileList); // Accion para realizar al pulsar sobre la lista lstOpciones.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> a, View v, int position, long id) { // Devuelvo los datos a la activity principal Intent data = new Intent(); data.putExtra("filename", item.get(position)); setResult(RESULT_OK, data); finish(); } }); } }
Segundo llamar la clase anterior desde la Activity principal.
Pega este codigo en la parte de tu Activity principal desde donde quieras listar y extraer el fichero que quieras usar.
Intent i = new Intent(); i.setClass(PrincipalActivity.this, ListaFilesActivity.class); startActivityForResult(i, ListaFiles);
¿que os parece? no es complicado, todo requiere practica y hacer varias pruebas, pero vamos si yo pude. ¡tu también! animo y si no te aclaras, pregunta en el foro!! ;p
Si te a gustado este sitio, por favor haz click en me gusta en Facebook, Google+, Tweeter... es el único precio que te pido por este trabajo! ;P. Compartiendo, ayudaras a otros a encontrar esta web! GRACIASSSS.