andriod listview

135
http://www.androidcurso.com/index.php/tutoriales-android/34- unidad-3-actividades-e-intenciones/128-la-vista-listview La vista ListView Una vista ListView visualiza una lista deslizable verticalmente de varios elementos, donde cada elemento puede definirse como un Layout .Su utilización es algo compleja, pero muy potente. Un ejemplo lo podemos ver en la siguiente figura: Definir un ListView conlleva los siguientes cuatro pasos: Diseñar un Layout que lo contenga al ListView Diseñar un Layout individual que se repetirá en la lista Implementar una actividad que lo visualice el Layout con el ListView Personalizar cada una de los Layouts individuales según nuestros datos Veamos estos pasos con más detalle: Para utilizar un ListView dentro de un Layout puedes de usar la siguiente estructura: <FrameLayout> <ListView android:id="@android:id/list"... /> <TextView android:id="@android:id/empty" ... /> </FrameLayout> Donde tenemos un FrameLayout que permite visualizar dos posibles elementos, uno u otro, pero no los dos simultáneamente. El primero es el ListView que se visualizará cuando haya algún elemento en la lista. El segundo puede ser cualquier tipo de vista y se visualizará cuando no existan elementos en la lista. El sistema controla la visibilidad de forma automática, solo has de tener cuidado de identificar cada uno de los elementos con el valor exacto que se muestra. NOTA: Recuerda que para crear nuevos identificadores debes utilizar la expresión"@+id/nombre_identificador". El carácter @ significa que se trata de un identificador de recurso que se definirá en la clase R.java. El carácter + significa que el recurso ha de ser creado

Upload: kayo-louis

Post on 23-Nov-2015

307 views

Category:

Documents


4 download

TRANSCRIPT

http://www.androidcurso.com/index.php/tutoriales-android/34-unidad-3-actividades-e-intenciones/128-la-vista-listviewLa vista ListViewUna vistaListViewvisualiza una lista deslizable verticalmente de varios elementos, donde cada elemento puede definirse como unLayout.Su utilizacin es algo compleja, pero muy potente.Un ejemplolo podemos ver en la siguiente figura:

Definir unListViewconlleva los siguientes cuatro pasos: Disear un Layout que lo contenga alListView Disear un Layout individual que se repetir en la lista Implementar una actividad que lo visualice el Layout con elListView Personalizar cada una de losLayoutsindividuales segn nuestros datosVeamos estos pasos con ms detalle:Para utilizar unListViewdentro de unLayoutpuedes de usar la siguiente estructura:

Donde tenemos unFrameLayoutque permite visualizar dos posibles elementos, uno u otro, pero no los dos simultneamente. El primero es elListViewque se visualizar cuando haya algn elemento en la lista. El segundo puede ser cualquier tipo de vista y se visualizar cuando no existan elementos en la lista. El sistema controla la visibilidad de forma automtica, solo has de tener cuidado de identificar cada uno de los elementos con el valor exacto que se muestra.NOTA:Recuerda que para crear nuevos identificadores debes utilizar la expresin"@+id/nombre_identificador".El carcter @ significa que se trata de un identificador de recurso que se definir en la clase R.java. El carcter + significa que el recurso ha de ser creado en este momento. En este caso hemos utilizado identificadores definidos en el sistema (es decir@android:significa que es un recurso definido en la clase android.R.java).Una vez creado elLayoutque contiene elListViewtendremos que visualizarlo en una actividad. Para este propsito utilizaremos untipo de actividad especial,ListActivity.Tambin tendremos que indicar al sistema cada uno de losLayouts individuales que contendr elListView. Esto lo haremos llamando al mtodosetListAdapter().Existen varias alternativas con diferentes grados de dificultad.Para una mejor conprensin iremos mostrando tres ejemplos de uso desetListAdapter(), de ms sencillo a ms complejo.

Las capturas anteriores muestran los tres ListView que vamos construir. El de la izquierda se limita a mostrar una lista de Strings. El del centro visualiza una lista de unLayoutdiseado por nosotros. Aunque este Layout tiene varios componentes (una imagen y dos textos), solo cambiamos uno de los textos. En el ltimo ejemplo cambiaremos tambin la imagen de cada elemento.video[Tutorial]Uso de ListViewUnListViewque visualiza una lista de StringsEjercicio paso a paso:Un ListView que visualiza una lista de Strings1.ElLayoutque utilizaremos en Asteroides para mostrar las puntuaciones se llamarpuntuaciones.xml. En el se incluye una vistaListView. Crea elLayoutcon el siguiente cdigo:

2.Necesitamos ahora crear la actividadPuntuacionespara visualizar el Layout anterior. Crea una nueva clase en tu proyecto e introduce el siguiente cdigo:publicclassPuntuacionesextendsListActivity {@OverridepublicvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.puntuaciones);setListAdapter(newArrayAdapter(this,android.R.layout.simple_list_item_1,Asteroides.almacen.listaPuntuaciones(10)));}}Toda actividad que vaya a visualizar unListViewha de heredar deListActivity. Adems, ha de llamar al mtodosetListAdapter()para indicar el adaptador con la lista de elementos a visualizar. En el ejemplo se ha utilizado una de la posibilidades ms sencillas, para crear un adaptador, usar la claseArrayAdapter. UnArrayAdaptercrea las vistas delListViewa partir de los datos almacenados en un array. Puedes utilizar un array que contenga datos de cualquier clase, no tienes ms que indicar enla clase deseada. En este caso se utiliza de un array de String[1].El constructor deArrayAdaptertiene tres parmetros: El primer parmetro es unContextcon informacin sobre el entorno de la aplicacin. Utilizaremos como contexto la misma actividad que hace la llamada. El segundo parmetro es unLayout, utilizado para representar cada elemento de la lista. En este ejemplo, en lugar de definir uno nuevo, utilizaremos una ya definido en el sistema. El ltimo parmetro es un array con los strings a mostrar. Para ello, llamamos al mtodolistaPuntuaciones()que nos devuelve esta lista del objeto estticoalmacende la claseAsteroides.3.Recuerda que toda nueva actividad ha de ser registrada enAndroidManifest.xml.4.Prueba si funcionan las modificaciones introducidas.UnListViewque visualizaLayoutspersonalizadosVamos a personalizar elListViewanterior para que cada elemento de la lista sea unLayoutdefinido por nosotros. Para ello sigue los siguientes pasos:Ejercicio paso a paso:Un ListView que visualiza layouts personalizados1.Reemplaza la clase anterior por:publicclassPuntuacionesextendsListActivity {@OverridepublicvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.puntuaciones);setListAdapter(newArrayAdapter(this,R.layout.elemento_lista, R.id.titulo,Asteroides.almacen.listaPuntuaciones(10)));}}Como hemos explicado, la claseArrayAdapterpermite insertar los datos desde un array deStringen nuestroListView.En este ejemplo se utiliza un constructor con cuatro parmetros:R.layout.elemento_lista:es una referencia de recurso a la vista que ser utilizada repetidas veces para formar la lista. Se define a continuacin.R.id.titulo:identifica un id de la vista anterior que ha de ser unTextView. Su texto ser reemplazado por el que se indica en el siguiente parmetro.Asteroides.almacen.listaPuntuaciones(10):vector deStringcon los textos que sern visualizados en cada uno de losTextView. Esta lista es obtenida accediendo a la claseAsteroidesa su variable estticaalmacenllamando a su mtodolistaPuntuaciones().2.Ahora hemos de definir el Layout que representar cada uno de los elementos de la lista. Crea el ficherores/Layout/elemento_lista.xmlcon el siguiente cdigo:

Este Layout representa una imagen a la izquierda con dos textos a la derecha, uno de mayor tamao en la parte superior. Para combinar estos elementos se ha escogido unRelativeLayout, donde el alto se establece a partir de un parmetro de configuracin del sistema?android:attr/listPreferredItemHeight. El primer elemento que contiene es unImageViewalineado a la izquierda. Su alto es la misma que el contenedor (match_parent) mientras que el ancho se establece con el mismo parmetro que el alto del contenedor. Por lo tanto la imagen ser cuadrada.3.Las imgenes utilizadas en la aplicacin Asteroides puedes descargarlas dewww.androidcurso.com. En el menEl gran libro de Android / Ficheros usados en ejerciciosdentro deGraficos.zip.Copia el ficheroasteriode1.png,asteriode2.png yasteriode3.pnga la carpetares/drawable.4.Ejecuta la aplicacin y verifica el resultado.UnListViewcon nuestro propio adaptadorEn el ejercicio anterior hemos visto como podamos asociar un Layout definido por nosotros alListViewy personalizar uno de sus campos. Si queremos algo ms adaptable,por ejemplo cambiar varios campos, tendremos que escribir nuestro propio adaptadorextendiendo la claseBaseAdapter. En esta clase habr que sobreescribir los siguientes cuatro mtodos:ViewgetView(intposition, View convertView, ViewGroup parent)Este mtodo ha de construir un nuevo objetoViewque ser visualizado en la posicinposition. Opcionalmente podemos partir de una vista baseconvertViewpara generar ms rpido este objeto. El ltimo parmetro corresponde al contenedor de vistas donde el objeto va a ser aadido.intgetCount()Devuelve el nmero de elementos de la lista.ObjectgetItem(intposition)Devuelve el elemento en una determinada posicin de la lista.longgetItemId(intposition)Devuelve el identificador de fila de una determinada posicin de la lista.Veamos un ejemplo:Ejercicio paso a paso:Un ListView con nuestro propio adaptador1.Crea la claseMiAdaptador.javaen el proyecto con el siguiente cdigo:publicclassMiAdaptadorextendsBaseAdapter {privatefinalActivityactividad;privatefinalVectorlista;publicMiAdaptador(Activity actividad, Vector lista) {super();this.actividad= actividad;this.lista= lista;}

publicView getView(intposition, View convertView,ViewGroup parent) {LayoutInflater inflater =actividad.getLayoutInflater();View view = inflater.inflate(R.layout.elemento_lista,null, true);true);TextView textView =(TextView)view.findViewById(R.id.titulo);textView.setText(lista.elementAt(position));ImageView imageView=(ImageView)view.findViewById(R.id.icono);switch(Math.round((float)Math.random()*3)){case0:imageView.setImageResource(R.drawable.asteroide1);break;case1:imageView.setImageResource(R.drawable.asteroide2);break;default:imageView.setImageResource(R.drawable.asteroide3);break;}returnview;}

publicintgetCount() {returnlista.size();}

publicObject getItem(intarg0) {returnlista.elementAt(arg0);}

publiclonggetItemId(intposition) {returnposition;}}2.En el constructor de la clase se indica la actividad donde se ejecutar y la lista de datos a visualizar. El mtodo ms importante de esta clase esgetView()el cual tiene que construir los diferentesLayoutsque sern aadidos en la lista. Comenzamos construyendo un objetoViewa partir del cdigo xml definido enelemento_lista.xml. Este trabajo se realiza por medio de la claseLayoutInflater.Luego, se modifica el texto de uno de losTextViewsegn el array que se pas en el constructor. Finalmente, se obtiene un nmero al azar (Math.round()) y se asigna uno de los tres grficos de forma aleatoria.3.Reemplaza en la clasePuntuacionesla llamada al constructor deArrayAdapterpor: setListAdapter(newMiAdaptador(this, Asteroides.almacen.listaPuntuaciones(10)));4.Ejecuta la aplicaciny verifica el resultado.NOTA:En algunos casos el adaptador ha de trabajar con listas muy grandes o estas listas han de ser creadas desde un servidor. En estos casos es mejor ir solicitando la informacin a medida que se va representando. Un ejemplo se muestra en la aplicacin ApiDemos descrita en el captulo 1, en la actividad:com.example.android.apis.view.List13Detectar una pulsacin sobre un elemento de la listaUnListViewpuede tener diferentes componentes que nos permitan interaccionar con el usuario. Por ejemplo, cada elemento definido engetView()puede tener botones para diferentes acciones.Hay un tipo de interaccin muy sencilla de definir. La claseListActivitytiene un mtodo que es invocado cada vez que se pulsa sobre un elemento de la lista. El siguiente ejercicio ilustra cmo utilizarlo.Ejercicio paso a paso:Detectar una pulsacin sobre un elemento de la lista1.Aade el siguiente mtodo a la clasePuntuaciones.java:@OverrideprotectedvoidonListItemClick(ListView listView,View view,intposition,longid) {super.onListItemClick(listView, view, position, id);Object o = getListAdapter().getItem(position);Toast.makeText(this,"Seleccin: "+ Integer.toString(position)+" - "+ o.toString(),Toast.LENGTH_LONG).show();}2.Ejecuta la aplicacin,pulsa en Puntuaciones y luego en una puntuacib para verificarel resultado.http://jarroba.com/listview-o-listado-en-android/ListView o listado en AndroidEste tutorial est indicado para todos lo que ya hayan buceado un poco en Android. Se dar por sentado ciertos conocimientos muy bsicos, cuyo apoyo pueden servirse de tutoriales anteriores como el de saberqu es una Actividad. Si no tienes mucho tiempo o quieres un Snippet de cdigo para hacer un listado rpidamente, entonceste recomiendo que vayas directamente al artculo de listado en pocas lneas; si por el contrarioquieres aprenderlo todo sobre listados de Android continuar leyendo es la opcin correcta.Aunque todo en el universo tienda al caos, siempre es bueno ponerle un orden para saber interpretarlo. No es la mejor definicin de listado, pero si una bonita alegora al mismo. Un listado es eso, un conjunto de datos ordenados, para que sea sencillo indagar en ellos.Este tutorial se basar en describir como hacer un listado en Android: en el que tenemos un nmero arbitrario de datos -nmero exacto de entradasqueno conocemos, bien porque obtengamos los datos de Internet, o estn en una base de datos que va creciendo, etc- de aves que queremos ordenar en un listado. Cuyas entradas queremos hacer a nuestro antojo con el nombre del ave como titular, una pequea descripcin y una imagen asociada a cada uno (Vasela imagen siguiente, para entender de un vistazo lo que se quiere conseguir).

Y no contentos con esto, queremos que adems sea seleccionable cada elemento del listado.

Para mostrar ms informacin en un Toast (tambin podramos abrir otra Activity con informacin extra, o lo que queramos) del elemento seleccionado.

Vamos, queconstruiremosun ListView de generacin dinmica de contenidos (Un ejemplo esttico lo tienes enla pgina oficial de desarrolladores de Android), deseable el 90% de la veces por un programador Android. Y s, las imgenes y textos del ejemplo estn obtenidos de laWikipedia.Como haremos esto de una manera sencilla y ptima. Primero lo entenderemos y luego lo haremos.Qu es lo que queremos hacer? Queremos un listado de todos los elementos/entradas individuales que me den la gana (entre cero e infinito). De lo real al concepto mental sera la siguiente imagen.

Todos las entradas son iguales, Sera maravilloso que se pudiera disear una nica entrada y luego que el resto sean un copiar y pegar? Aunque sea por vaguera, la respuesta es: debemos como buenos programadores.

Ya tenemos dividido lo que queremos hacer. Ahora, la lgica nos dice que en el diseo hacia delante, tendremos dos Layouts uno principal que contendr varias veces la copia del segundo: Uno con laentradasuelta, con el diseo que queramos. Ser la unidad que se copiar en el interior del listado. Lo llamaremos en este ejemplo entrada.xml. Otro con ellistado, que solo dispondr de tal. Con los huecos esperando para contener la copia del diseo de la entrada; y cada entrada con unos datos diferentes. A este contenedor de entradas lo llamaremos listado.xml.

Haremos el diseo de entrada.xml. Para el ejemplo haremos el siguiente Layout, que evidentemente podremos hacer a nuestro antojo, con los campos que queramos, imgenes, botones, checkbox, spinner, etc. Al disear ste, pensemos, no en el contenido de cada entrada, sino como haremos todas las entradas para que salgan iguales. Pues este ser replicado para todas la entradas.Para el ejemplo, la idea de una entrada es la siguiente:

Y su cdigo asociado para generar la vista de una entrada sera este (Nota: por reducir cdigo y que se entienda mejor, hemos optado por poner los Strings directamente; esto est mal hecho y deberan ir al fichero strings.xml). Evidentemente ponemos los id para luego referenciarlos y llenar cada una de las entradas con sus datos correspondientes.

Fcil? No. Ms fcil es listado.xml. En este ejemplo nos bastar con que usemos ListView, que ser el contenedor de las entradas.

Falta que hagamos la lgica del programa. La lgica que nos cargar los datos y nos construir el listado. Para esto tendremos una Actividad que ser la que muestre el listado. Para no liar las cosas lo haremos en el ejemplo en la clase MainActivity.java. Esta har uso de otras dos. Una que encapsule los datos de la entrada, cuyo nombre pondremos como Lista_entrada.java. Y otra que ser la que adapte las entradas a la lista, y ser nombrada como Lista_adaptador.java.Terminaremos teniendo los siguientes archivos en el explorador de paquetes. Donde los marcados sern los que usaremos en este ejemplo. Cabe indicar que las imgenes las estamos insertando directamente para no complicar ms el ejemplo, pero esta forma de construir el listado dinmicamente tambin funcionara si las imgenes se descargaran de internet, se obtuvieran de la memoria del telfono, etc.

Empezaremos a definir Lista_entrada.java. Para qu sirve? Sabemos que nos llegarn unos datos, y que nos interesan los siguientes para cada entrada: imagen, ttulo y descripcin. Por lo que haremos unos paquetes de datos para cada uno de los conjuntos de la entrada. Estos paquetes sern objetos de la clase Lista_entrada.java.

Para hacernos una idea, imaginemos que tenemos tres pjaros. Cada uno con: ttulo, descripcin e imagen. Tendremos tres objetos de la clase Lista_entrada.java, cada uno almacenar sus datos. Pero no confundamos, esto no est asignado todava a la entrada de la vista -de la interfaz- sino que son grupos para separar la informacin. Estos grupos se suelen llamar manejadores o en ingls handler.

El cdigo siguiente contiene lo que es la encapsulacin de los datos, que coinciden con los explicados: Ttulo, con nombre de variable como textoEncima para especificar en cul de los dos TextViews de la vista tendr que ser colocado. Descripcin, la variable la llamaremos como textoDebajo. Imagen, y almacenaremos la variable idImagen, para referenciara a la imagen. Solo guardaremos el id, ya que solo guardaremos el identificador de la imagen y no la imagen en s (para este ejemplo no lo complicamos y guardamos el identificador, pero si queremos podremos guardar un Drawable, un Bitmap, etc).Este manejador tendr las variables de los View que hayamos declarado en el Layout entrada.xml. Repito, aqu no lo referenciaremos, es solo un contenedor que separa unos datos de otros.Si nos fijamos en el su cdigo, solo son variables, con sus getters y de setter el mismo constructor. No tiene ms la clase, es as de simple (aqu, para que se entienda mejor, ponemos los getters y setters; Android recomienda por optimizar hacer variables globales publicas y olvidarnos de getters y setters, con lo que sera todava mucho ms simple este cdigo).package jarroba.ramon.listado;

public class Lista_entrada {private int idImagen; private String textoEncima; private String textoDebajo;

public Lista_entrada (int idImagen, String textoEncima, String textoDebajo) { this.idImagen = idImagen; this.textoEncima = textoEncima; this.textoDebajo = textoDebajo; }

public String get_textoEncima() { return textoEncima; }

public String get_textoDebajo() { return textoDebajo; }

public int get_idImagen() { return idImagen; } }Cmo encapsulamos los datos que queramos en este Handler? Muy sencillo, ya vers.Sicreamos el objeto Lista_entradatal cual, lo haramos de la siguiente manera:new Lista_entrada(R.drawable. imagen, "TTULO", "Descripcin");Dnde asignamos el objeto? Cuntos objetos vamos a tener de estos? La respuesta es en una lista de Java, ms concretamente en un ArrayList.En este ejemplo lo haremos directamente sobre la clase MainActivity.java como ejemplo la siguiente (Nota: lo que se muestra a continuacin es un trozo de la clase MainActivity.java, se muestra completa al final del artculo). Aqu un ejemplo de comoaadir la informacin de las tres aves al ArrayList:package jarroba.ramon.listado;

import java.util.ArrayList;

import android.app.Activity;import android.os.Bundle;import android.widget.ListView;

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listado);

ArrayList datos = new ArrayList();

datos.add(new Lista_entrada(R.drawable.im_buho, "BUHO", "Bho es el nombre comn de aves de la familia Strigidae, del orden de las estrigiformes o aves rapaces nocturnas. Habitualmente designa especies que, a diferencia de las lechuzas, tienen plumas alzadas que parecen orejas.")); datos.add(new Lista_entrada(R.drawable.im_colibri, "COLIBR", "Los troquilinos (Trochilinae) son una subfamilia de aves apodiformes de la familia Trochilidae, conocidas vulgarmente como colibres, quindes, tucusitos, picaflores, chupamirtos, chuparrosas, huichichiquis (idioma nahuatl), mainumby (idioma guaran) o guanumby. Conjuntamente con las ermitas, que pertenecen a la subfamilia Phaethornithinae, conforman la familia Trochilidae que, en la sistemtica de Charles Sibley, se clasifica en un orden propio: Trochiliformes, independiente de los vencejos del orden Apodiformes. La subfamilia Trochilinae incluye ms de 100 gneros que comprenden un total de 330 a 340 especies.")); datos.add(new Lista_entrada(R.drawable.im_cuervo, "CUERVO", "El cuervo comn (Corvus corax) es una especie de ave paseriforme de la familia de los crvidos (Corvidae). Presente en todo el hemisferio septentrional, es la especie de crvido con la mayor superficie de distribucin. Con el cuervo de pico grueso, es el mayor de los crvidos y probablemente la paseriforme ms pesada; en su madurez, el cuervo comn mide entre 52 y 69 centmetros de longitud y su peso vara de 0,69 a 1,7 kilogramos. Los cuervos comunes viven generalmente de 10 a 15 aos pero algunos individuos han vivido 40 aos. Los juveniles pueden desplazarse en grupos pero las parejas ya formadas permanecen juntas toda su vida, cada pareja defendiendo un territorio. Existen 8 subespecies conocidas que se diferencian muy poco aparentemente, aunque estudios recientes hayan demostrado diferencias genticas significativas entre las poblaciones de distintas regiones.")); }

}Todava no hemos acabado con la clase MainActivity.java. Faltara decirle que queremos hacer con el ArrayList, que ser envirselo a la lista para que lo reconstruya y la de forma.A toda ListView hay que pasarle un adaptador con los datos y que herede de BaseAdapter (Son cosas de Android).Antes un inciso. Hemos trabajado y conocemos la pesadez de hacer el adaptador de un listado de manera dinmica. Por esowww.jarroba.comquiere haceros un regalo, con el siguiente ahorro de tiempo y de comerse la cabeza. En todos los ejemplos que he visto por ah, construyen un adaptador independiente para cada handler para este tipo de listas simples. Y yo he dicho: no, nunca ms, no es necesario, un solo adaptador vale para todas las listas con entradas personalizadas que queramos (o al menos todas con las que he trabajado). A continuacin les regalo el cdigo, que en apariencia es sencillo; lo que s es muy fcil de utilizar. Es el trabajo de mucho tiempo, errores y experiencia. Puede que sea mejorable, por lo que si descubres y nos lo quieres contar, o descubro una manera mejor actualizar este tutorial. Pero por ahora no he visto nada ms cmodo para trabajar con listas. Por supuesto, eres libre de modificarlo, proponer mejoras y de usarlo. Nota: este adaptador universal es solo para listas simples con vistas complejas, lo que es que van a cargarse un vez los elementos de la lista y ya no se van a modificar ms mientras el usuariointeraccionecon la lista; si queremos aadir o eliminar elementos mientras el usuario toca la lista, requerimos de otro tipo de adaptador (Puedes aprender como utiliza inflate() el mtodo getView() del Adapter en este otro tutorial).Cdigo de la clase Lista_adaptador.java:package jarroba.ramon.listado;

import java.util.ArrayList;

import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;

/** Adaptador de ListView universal, para www.jarroba.com * @author Ramon Invarato Menndez */public abstract class Lista_adaptador extends BaseAdapter {

private ArrayList entradas; private int R_layout_IdView; private Context contexto;

public Lista_adaptador(Context contexto, int R_layout_IdView, ArrayList entradas) { super(); this.contexto = contexto; this.entradas = entradas; this.R_layout_IdView = R_layout_IdView; }

@Override public View getView(int posicion, View view, ViewGroup pariente) { if (view == null) { LayoutInflater vi = (LayoutInflater) contexto.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = vi.inflate(R_layout_IdView, null); } onEntrada (entradas.get(posicion), view); return view; }

@Override public int getCount() { return entradas.size(); }

@Override public Object getItem(int posicion) { return entradas.get(posicion); }

@Override public long getItemId(int posicion) { return posicion; }

/** Devuelve cada una de las entradas con cada una de las vistas a la que debe de ser asociada * @param entrada La entrada que ser la asociada a la view. La entrada es del tipo del paquete/handler * @param view View particular que contendr los datos del paquete/handler */ public abstract void onEntrada (Object entrada, View view);

}Este cdigo lo que hace es crear un adaptador para ListView. En el constructor hay que pasarle el contexto de la aplicacin, el id del layout de la entrada (en este ejemplo R.layout.entrada), y el ArrayList que construimos anteriormente con los handler con los datos. Como es obvio, ya que pide los datos del ArrayList, este cdigo ir justo despus de la creacin del ArrayList. Al crear el objeto se nos pedir sobrescribir el mtodo onEntrada, que ser donde asignaremos cada parte del handler de la clase Lista_entrada.java a cada una de las copias de las vistas entrada.xml. onEntrada da de informacin: el objeto con solo los datos de la entrada que va a construir y la vista donde lo va a meter. Te sorprender el escaso cdigo que hay que usar y lo simple que es su uso,a continuacinlo veremos.Una vista rpida de donde se usa este adaptador.

En el ejemplo lo situaremos dentro del MainActivity.java en el onCreate, despus del cdigo que ya haba (Nota: como comentamos anteriormente, al final publicaremos el cdigo completo).Cdigo para usar el adaptador:ListView lista = (ListView) findViewById(R.id.ListView_listado); lista.setAdapter(new Lista_adaptador(this, R.layout.entrada, datos){@Overridepublic void onEntrada(Object entrada, View view) { TextView texto_superior_entrada = (TextView) view.findViewById(R.id.textView_superior); texto_superior_entrada.setText(((Lista_entrada) entrada).get_textoEncima());

TextView texto_inferior_entrada = (TextView) view.findViewById(R.id.textView_inferior); texto_inferior_entrada.setText(((Lista_entrada) entrada).get_textoDebajo());

ImageView imagen_entrada = (ImageView) view.findViewById(R.id.imageView_imagen); imagen_entrada.setImageResource(((Lista_entrada) entrada).get_idImagen());}});Este poco de cdigo usa el adaptador. Se asigna cada View con su dato en el momento justo en el que seconstruyecada entrada No dije que era fcil?.Ya solo quedacapturar el evento de Click para cada una de las entradas y hacer lo que sea con esta. En este ejemplo recogemos la descripcin y la mostramos en un Toast. Esto lo hacemos al devolver el adaptador y conociendo la posicin nos habr devuelto la entrada pulsada. Despus del anterior cdigo escribimos el escuchador del evento click como se hace normalmente:lista.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView pariente, View view, int posicion, long id) { Lista_entrada elegido = (Lista_entrada) pariente.getItemAtPosition(posicion);

CharSequence texto = "Seleccionado: " + elegido.get_textoDebajo(); Toast toast = Toast.makeText(MainActivity.this, texto, Toast.LENGTH_LONG); toast.show(); } });Y ya al fin,el cdigo completo del MainActivity.java, es el siguiente:package jarroba.ramon.listado;

import java.util.ArrayList;

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;

public class MainActivity extends Activity {

private ListView lista;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listado);

ArrayList datos = new ArrayList();

datos.add(new Lista_entrada(R.drawable.im_buho, "BUHO", "Bho es el nombre comn de aves de la familia Strigidae, del orden de las estrigiformes o aves rapaces nocturnas. Habitualmente designa especies que, a diferencia de las lechuzas, tienen plumas alzadas que parecen orejas.")); datos.add(new Lista_entrada(R.drawable.im_colibri, "COLIBR", "Los troquilinos (Trochilinae) son una subfamilia de aves apodiformes de la familia Trochilidae, conocidas vulgarmente como colibres, quindes, tucusitos, picaflores, chupamirtos, chuparrosas, huichichiquis (idioma nahuatl), mainumby (idioma guaran) o guanumby. Conjuntamente con las ermitas, que pertenecen a la subfamilia Phaethornithinae, conforman la familia Trochilidae que, en la sistemtica de Charles Sibley, se clasifica en un orden propio: Trochiliformes, independiente de los vencejos del orden Apodiformes. La subfamilia Trochilinae incluye ms de 100 gneros que comprenden un total de 330 a 340 especies.")); datos.add(new Lista_entrada(R.drawable.im_cuervo, "CUERVO", "El cuervo comn (Corvus corax) es una especie de ave paseriforme de la familia de los crvidos (Corvidae). Presente en todo el hemisferio septentrional, es la especie de crvido con la mayor superficie de distribucin. Con el cuervo de pico grueso, es el mayor de los crvidos y probablemente la paseriforme ms pesada; en su madurez, el cuervo comn mide entre 52 y 69 centmetros de longitud y su peso vara de 0,69 a 1,7 kilogramos. Los cuervos comunes viven generalmente de 10 a 15 aos pero algunos individuos han vivido 40 aos. Los juveniles pueden desplazarse en grupos pero las parejas ya formadas permanecen juntas toda su vida, cada pareja defendiendo un territorio. Existen 8 subespecies conocidas que se diferencian muy poco aparentemente, aunque estudios recientes hayan demostrado diferencias genticas significativas entre las poblaciones de distintas regiones.")); datos.add(new Lista_entrada(R.drawable.im_flamenco, "FLAMENCO", "Los fenicopteriformes (Phoenicopteriformes), los cuales reciben el nombre vulgar de flamencos, son un orden de aves neognatas, con un nico gnero viviente: Phoenicopterus. Son aves que se distribuyen tanto por el hemisferio occidental como por el hemisferio oriental: existen cuatro especies en Amrica y dos en el Viejo Mundo. Tienen crneo desmognato holorrino, con 16 a 20 vrtebras cervicales y pies anisodctilos.")); datos.add(new Lista_entrada(R.drawable.im_kiwi, "KIWI", "Los kiwis (Apterix, gr. 'sin alas') son un gnero de aves paleognatas compuesto por cinco especies endmicas de Nueva Zelanda.1 2 Son aves no voladoras pequeas, aproximadamente del tamao de una gallina. Antes de la llegada de los humanos alrededor del ao 1300, en Nueva Zelanda los nicos mamferos que haba eran murcilagos, y los nichos ecolgicos que en otras partes del mundo eran ocupados por animales tan diversos como caballos, lobos y ratones fueron utilizados en Nueva Zelanda por pjaros (y en menor proporcin por ciertas especies de reptiles). La denominacin kiwi es maor, idioma del pueblo homnimo de linaje malayopolinesio que coloniz Nueva Zelanda antes de la llegada de los europeos.")); datos.add(new Lista_entrada(R.drawable.im_loro, "LORO", "Las Psitcidas (Psittacidae) son una familia de aves psitaciformes llamadas comnmente loros o papagayos, e incluye a los guacamayos, las cotorras, los periquitos, los agapornis y formas afines.")); datos.add(new Lista_entrada(R.drawable.im_pavo, "PAVO", "Pavo es un gnero de aves galliformes de la familia Phasianidae, que incluye dos especies, el pavo real comn (Pavo cristatus) y el pavo real cuelliverde (Pavo muticus).1")); datos.add(new Lista_entrada(R.drawable.im_pinguino, "PINGINO", "Los pinginos (familia Spheniscidae, orden Sphenisciformes) son un grupo de aves marinas, no voladoras, que se distribuyen nicamente en el Hemisferio Sur, sobre todo en sus altas latitudes."));

lista = (ListView) findViewById(R.id.ListView_listado); lista.setAdapter(new Lista_adaptador(this, R.layout.entrada, datos){@Overridepublic void onEntrada(Object entrada, View view) { if (entrada != null) { TextView texto_superior_entrada = (TextView) view.findViewById(R.id.textView_superior); if (texto_superior_entrada != null) texto_superior_entrada.setText(((Lista_entrada) entrada).get_textoEncima());

TextView texto_inferior_entrada = (TextView) view.findViewById(R.id.textView_inferior); if (texto_inferior_entrada != null) texto_inferior_entrada.setText(((Lista_entrada) entrada).get_textoDebajo());

ImageView imagen_entrada = (ImageView) view.findViewById(R.id.imageView_imagen); if (imagen_entrada != null) imagen_entrada.setImageResource(((Lista_entrada) entrada).get_idImagen()); }}});

lista.setOnItemClickListener(new OnItemClickListener() { @Overridepublic void onItemClick(AdapterView pariente, View view, int posicion, long id) {Lista_entrada elegido = (Lista_entrada) pariente.getItemAtPosition(posicion);

CharSequence texto = "Seleccionado: " + elegido.get_textoDebajo(); Toast toast = Toast.makeText(MainActivity.this, texto, Toast.LENGTH_LONG); toast.show();} });

}

}Esperamos que haya sido aclaratorio y para entender muchas cosas sobre cmo se construye una lista.Aqu dejo paradescargar el proyecto entero:ListadoEn respuesta a las preguntas ms comunes de nuestros lectores. Si quieres hacer otra cosa con los listados, as como si has visto cosas que no has sabido como solucionar; e incluso, con lo aqu aprendido, como hacer un GridView o un Spinner completamente personalizados. Te recomiendo que eches una ojeada al artculo que expande los conocimientos de ListView, se solventan muchas dudas y ensea mucho ms, en:http://jarroba.com/expansion-listview/Tambin puede ser muy interesante el artculo sobreprogramar para diferentes dispositivos Android con la arquitectura de Fragments, en el que extiendo un poco ms el ejemplo de listado y aado conceptos avanzados.ListViews personalizadas en AndroidTengo un par de amigos que estn empezando a meterse en el mundillo de la programacin para Android, y como buenos principiantes, tienen muchas ganas pero tambin muchas dudas.Hace unos das me preguntaron por cmo hacer listas personalizadas para sus aplicaciones de Android. A pesar de que hay bastantes ejemplos por Internet (y tambin est disponible ladocumentacin de Google) he mirado algunas pginas y desde luego no destacan por su sencillez a la hora de dar explicaciones, por lo que quiz una persona que est empezando en el mundillo los encuentre bastante difcil de entender. As que me he decidido a, en lugar de explicrselo personalmente a ellos, hacer un post con una explicacin lo ms clara posible y si as puedo ayudar a alguna otra persona bienvenido sea.

Quiero unListViewque contenga imgenesLas listas en Android se llenan de elementos mediante unAdapter, que, para explicarlo de forma sencilla, es una especie de puente entre la lista y los datos que queremos que aparezcan en esa lista. Esto quiere decir que no importan los datos que deseemos aadir a una lista, laListViewsiempre ser igual, cambiando elAdapter.Nos podemos encontrar con varios tipos deAdapterpor defecto, como, por ejemplo, elArrayAdapter,que muestra unarrayen una lista.Adems delAdaptertambin necesitamos un archivo xml donde se especifique cmo va a ser la lista. Estos archivos son archivoslayout, exactamente iguales a los que definen cmo son las actividades de nuestra aplicacin. Android cuenta con varios archivoslayoutpara listas por defecto, comosimple_list_item1, simple_list_item2 Dependiendo del layout que escojas la lista tendr un aspecto u otro (y tendrs que escoger unAdapteru otro, o sobreescribir mtodos).Pero como todo esto es muy sencillo vamos a lo que importa: vamos a crear una lista que muestre la lista del Consejo de Direccin de la empresa Cebollas Paco S.L; lista que nos mostrar una foto del directivo, su nombre completo y su cargo.Creando el layout para los elementosCreamos un archivolayoutde la forma habitual, escogiendo la opcinXML Layout File. Lo llamaremositemlista.xmly constar de unaRelativeLayout, unImageViewcon ID foto y dosTextViewde distinto tamao, el mayor con el ID nombre y el menor con el ID cargo.Diseamos a nuestro gusto nuestrolayout.En mi caso he dado unpaddingde 10dp a laRelativeLayouty he colocado los campos de texto a la izquierda de la imagen (he colocado el androide en el campo de imagen para que sea visible y ms fcil de entender, pero una vez le dais una altura y anchura podis dejarlo vaco ya que los que tenga cada campo en el XML se sobreescribirn mediante los datos que pasemos por cdigo).Estupendo, ya tenemos cmo se vern los elementos de nuestra lista personalizada. Ahora vamos a lo ms importante: el cdigo.Creando un objetoDirectivoPara poder llenar nuestra lista de los directivos de la empresa tendremos que crear un objeto que nos permita representarlos. Para ello crearemos una nueva clase dentro de nuestro proyecto, la clase Directivo, que utilizaremos para crear un objeto de tipoDirectivo donde se puedan almacenar los datos deseados: fotografa, nombre y cargo. Recordad que es una clase auxiliar, as que debe crearse como tal, no como una actividad (no hay que registrarla en AndroidManifest ni crear un xml asociado).Esta clase contendr tres elementos protegidos, unDrawablepara la fotografa (no tiene por qu ser unDrawablede forma obligatoria, puede ser unDrawableo lo que sea que necesites), dosStringpara el nombre y para el cargo y unlongpara poder obtener el tem con el que se est interactuando en el caso de que queramos dar esa opcin. Una vez declarados los elementos (y hechas las importaciones necesarias)podemos hacerlo todo un poco ms sencillo utilizando las herramientas automticas de Eclipse que nos permiten crear automticamente el constructor y los mtodossetyget(clic derecho sobre el editor de cdigo > Source).Grficamente un objeto directivo ser algo as:

Nuestra clase Directivo tendr la siguiente pinta:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657package com.naroh.pruebalistviewimagenes;import android.graphics.Drawable;public class Directivo {protected Drawable foto;protected String nombre;protected String cargo;protected long id;public Directivo(Drawable foto, String nombre, String cargo) {super();this.foto = foto;this.nombre = nombre;this.cargo = cargo;}public Directivo(Drawable foto, String nombre, String cargo, long id) {super();this.foto = foto;this.nombre = nombre;this.cargo = cargo;this.id = id;}public Drawable getFoto() {return foto;}public void setFoto(Drawable foto) {this.foto = foto;}public String getNombre() {return nombre;}public void setNombre(String nombre) {this.nombre = nombre;}public String getCargo() {return cargo;}public void setCargo(String cargo) {this.cargo = cargo;}public long getId() {return id;}public void setId(long id) {this.id = id;}}

Creando nuestro propioAdapterDado que la lista representar objetos que hemos creado es bastante obvio que no podremos utilizar ningnadapterpredefinido. Por lo tanto tendremos que crear nosotros mismos uno, algo que no es demasiado difcil una vez le pillas el truco. Bsicamente ser un conjunto de unaActivity(o sea, el contexto de la actividad en la que mostraremos la lista) y unArrayListde nuestros directivos, lo que representaremos porArrayList.Para crear nuestroAdaptercrearemos la claseAdapterDirectivos.y extenderemos deBaseAdapter,implementando los mtodos deBaseAdapternecesarios.Si te cuesta ver mentalmente la estructura delArrayListimagnate una cuerda de tender la ropa (elarray) de donde cuelgan un montn de calcetines (los directivos). Ms o menos as te puedes acercar a dibujar mentalmente cmo es un array de objetos.A continuacin os dejo mi claseAdapterDirectivos.Hay una cosa que aparece ah y no he explicado, y es eseconvertViewque aparece en el mtodo getView. Se trata de un truquillo para aumentar la eficiencia a la hora depintarlas listas, y podis ahondar un poco sobre ello en este post:Using convertView in getView() to make ListView efficienty en ladocumentacin de Android. He colocado unos comentariosinlineen el cdigo que espero que sean suficientemente explicativos:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566package com.naroh.pruebalistviewimagenes;import java.util.ArrayList;import android.app.Activity;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class AdapterDirectivos extends BaseAdapter{protected Activity activity;protected ArrayList items;public AdapterDirectivos(Activity activity, ArrayList items) {this.activity = activity;this.items = items;}@Overridepublic int getCount() {return items.size();}@Overridepublic Object getItem(int arg0) {return items.get(arg0);}@Overridepublic long getItemId(int position) {return items.get(position).getId();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// Generamos una convertView por motivos de eficienciaView v = convertView;//Asociamos el layout de la lista que hemos creadoif(convertView == null){LayoutInflater inf = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);v = inf.inflate(R.layout.itemlista, null);}// Creamos un objeto directivoDirectivo dir = items.get(position);//Rellenamos la fotografaImageView foto = (ImageView) v.findViewById(R.id.foto);foto.setImageDrawable(dir.getFoto());//Rellenamos el nombreTextView nombre = (TextView) v.findViewById(R.id.nombre);nombre.setText(dir.getNombre());//Rellenamos el cargoTextView cargo = (TextView) v.findViewById(R.id.cargo);cargo.setText(dir.getCargo());// Retornamos la vistareturn v;}}

Cargando el contenido en la listaLo ms complicado ya ha pasado. Ahora lo nico que tenemos que hacer es adecuar la actividad donde vamos a mostrar la lista y su layout. En el cdigo de la actividad tendremos que crear objetos Directivo que introduciremos en unArrayListeinstanciar unAdapterDirectivosy colocarlo como elAdapterde la lista que tenemos en nuestrolayoutde actividad.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package com.naroh.pruebalistviewimagenes;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.widget.ListView;public class Principal extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_principal);ListView lista = (ListView) findViewById(R.id.listadirectivos);ArrayList arraydir = new ArrayList();Directivo directivo;// Introduzco los datosdirectivo = new Directivo(getResources().getDrawable(R.drawable.ariannahuffington), "Arianna Huffington", "Presidenta");arraydir.add(directivo);directivo = new Directivo(getResources().getDrawable(R.drawable.corinna), "Princesa Corinna", "CEO");arraydir.add(directivo);directivo = new Directivo(getResources().getDrawable(R.drawable.hillaryclinton), "Hillary Clinton", "Tesorera");arraydir.add(directivo);directivo = new Directivo(getResources().getDrawable(R.drawable.bono), "Bono el de U2", "Amenizador");arraydir.add(directivo);directivo = new Directivo(getResources().getDrawable(R.drawable.carmenmairena), "Carmen de Mairena", "Directora RRHH");arraydir.add(directivo);// Creo el adapter personalizadoAdapterDirectivos adapter = new AdapterDirectivos(this, arraydir);// Lo aplicolista.setAdapter(adapter);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.principal, menu);return true;}}

Todo listoYa est! No ha sido tan terrible, verdad? Tras estos sencillos pasos tendremos el resultado de la imagen que encabeza este post.Adems del cdigo aqu posteado tambin he creado un repositorio en GitHub con el proyecto para que lo descarguis y ejecutis en vuestro Eclipse si lo deseis:Android-Custom-ListView-with-images.Mucha suerte con la programacin y que vaya todo bien. Y recuerda que si no entiendes algo siempre puedes preguntar en los comentarios.El patrn ViewHolderAunque esta implementacin funciona perfectamente, en el caso de que tu lista contenga muchos elementos puede ser til que eches un vistazo al patrn ViewHolder, que permitir que tu lista tenga un mejor rendimiento a la hora de hacer scroll. Puedes leer el post sobre el patrn ViewHolder aqu:El patrn ViewHolder para ListViews.http://www.oneoctopus.es/desarrollo-android/listviews-personalizadas-en-android/http://amatellanes.wordpress.com/2013/04/14/ejemplo-de-listview-en-android/ANDROID >> EJEMPLO DE LISTVIEW ENANDROID

Una vistaListViewvisualiza una lista deslizable verticalmente de varios elementos, donde cada elemento puede definirse como unlayout. Su utilizacin es algo compleja, pero muy potente.A continuacin voy a realizar un ejemplo usando unListView, pero a diferencia de otros ejemplos que he encontrado en la red, donde solo se muestra una lista por pantalla, voy a mostrar por pantalla la vistaListViewjunto a otra vista, en este caso una vistaWebView, de tal manera que nuestra aplicacin quedar de la siguiente manera:

Primero vamos a crear las vistas de nuestra aplicacin. En este caso tendremos dos: la vista principalmain.xmly la vista para cada uno de los elementos de la listalist_item.xml. En el layoutmain.xmldefinimos una vistaListViewy una vistaWebView. Le hemos asignado a cada uno de los dos elementos un peso mediante el atributoandroid:layout_weight, en ambos elementos el peso es el mismo para dividir en dos partes iguales la pantalla:main.xml12345678910111213141516171819

Como hemos dicho, el layoutlist_item.xmles la vista que tendr cada uno de los elemento de la lista. En esta ocasin, para cada elemento vamos a mostrar una imagen y un texto:list_item.xml1234567891011121314151617181920212223

Bien, una vez definidos nuestras vistas vamos a empezar a crear la lgica de la aplicacin. Comenzamos creando la claseItem, donde definiremos el contenido de cada uno de los elementos de la lista. En este caso, cadaItemva a almacenar informacin sobre pelculas. Adems de la imagen y el titulo que vamos a mostrar en la vista, almacenaremos tambin una direccin de una pgina Web que contiene informacin sobre la pelcula, pero que no se va a mostrar en la lista.Item.java1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.amatellanes.android.examples;public class Item {private int image;private String title;private String url;public Item() {super();}public Item(int image, String title, String url) {super();this.image = image;this.title = title;this.url = url;}public int getImage() {return image;}public void setImage(int image) {this.image = image;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}

El siguiente paso es crear el adaptador ItemAdapter para la lista. Dicho adaptador debe heredar de la claseBaseAdapter. Deberemos implementar obligatriamente los siguientes mtodos: intgetCount() Devuelve el nmero de elementos de la lista. ObjectgetItem(intposition) Devuelve el elemento en una determinada posicin de la lista. longgetItemId(intposition) Devuelve el identificador de fila de una determinada posicin de la lista. ViewgetView(intposition, View convertView, ViewGroup parent) Este mtodo ha de construir un nuevo objetoViewcon ellayoutcorrespondiente a la posicinpositiony devolverlo. Opcionalmente, podemos partir de una vista baseconvertViewpara generar ms rpido las vistas. El ltimo parmetro corresponde al padre al que la vista vaa ser aadida.Adems vamos a definir el siguiente constructor: ItemAdapter(Context context, List items) Recibe el contacto de la aplicacin y la lista de elementos que se van a mostrar en la lista.La claseItemAdapterquedara de la siguiente manera:ItemAdapter.java12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061package com.amatellanes.android.examples;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class ItemAdapter extends BaseAdapter {private Context context;private List items;public ItemAdapter(Context context, List items) {this.context = context;this.items = items;}@Overridepublic int getCount() {return this.items.size();}@Overridepublic Object getItem(int position) {return this.items.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View rowView = convertView;if (convertView == null) {// Create a new view into the list.LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);rowView = inflater.inflate(R.layout.list_item, parent, false);}// Set data into the view.ImageView ivItem = (ImageView) rowView.findViewById(R.id.ivItem);TextView tvTitle = (TextView) rowView.findViewById(R.id.tvTitle);Item item = this.items.get(position);tvTitle.setText(item.getTitle());ivItem.setImageResource(item.getImage());return rowView;}}

En el mtodogetView()lo primero que vamos a hacer es comprobar si la vistaconvertViewpuede ser reutilizada para no tener que inflarla nuevamente si no es necesario, de esta manera optimizaremos nuestra lista. Existen otras tcnicas para mejorar el rendimiento de una vistaListViewque podis consultaraqu.Por ultimo, definimos nuestra actividad principal. Para hacer la aplicacin ms profesional, vamos a mostrar un indicador de carga y un mensaje mientras se est cargando la pgina Web con la informacin de la pelcula. Para habilitar el indicador de carga en la barra de ttulo debemos de escribir:1234567891011@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Display a indeterminate progress bar on title barrequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);this.setContentView(R.layout.main);...}

Para mostrar y ocultar el indicador usamos el mtodosetProgressBarIndeterminateVisibilitycon los valorestrueofalse.A continuacin creamos la lista con los tems (pelculas que se van a aadir a la lista) y llamar al mtodosetListAdapter()para enviar a la lista de elementos a visualizar.Luego debemos de definir la accin que se va a realizar cuando se seleccione cada uno de los elementos de la lista:123456789101112131415161718192021222324// Register a callback to be invoked when an item in this AdapterView// has been clickedlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView adapter, View view, int position, long arg) {// Sets the visibility of the indeterminate progress bar in the// titlesetProgressBarIndeterminateVisibility(true);// Show progress dialogprogressDialog = ProgressDialog.show(MainActivity.this, "ProgressDialog", "Loading!");// Tells JavaScript to open windows automatically.webView.getSettings().setJavaScriptEnabled(true);// Sets our custom WebViewClient.webView.setWebViewClient(new myWebClient());// Loads the given URLItem item = (Item) listView.getAdapter().getItem(position);webView.loadUrl(item.getUrl());}});

Como vemos cada vez que se pulse un elemento se mostrar el indicador de carga en la barra de ttulo y el mensaje de carga, y a continuacin se abrir la direccin Web correspondiente a cada elemento en la lista.Debemos de definir un cliente para que la pgina se cargue en la misma pantalla y nos se abra la pgina en un navegador Web que tengamos instalados, para ello definimos la siguiente clase interna:1234567891011121314151617181920private class myWebClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// Load the given URL on our WebView.view.loadUrl(url);return true;}@Overridepublic void onPageFinished(WebView view, String url) {// When the page has finished loading, hide progress dialog and// progress bar in the title.super.onPageFinished(view, url);setProgressBarIndeterminateVisibility(false);progressDialog.dismiss();}}

Hemos sobrescrito el mtodoshouldOverrideUrlLoadingpara evitar que se abra la direccin Web en el navegador y adems hemos sobrescrito el mtodoonPageFinishedpara que se cierre el mensaje de carga y se oculta el indicador de la barra de ttulo cuando se termine de cargar la la pgina Web. La clase MainActivity.java quedara as:MainActivity.java1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798package com.amatellanes.android.examples;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.view.View;import android.view.Window;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.AdapterView;import android.widget.ListView;public class MainActivity extends Activity {private ListView listView;private WebView webView;private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Display a indeterminate progress bar on title barrequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);this.setContentView(R.layout.main);this.listView = (ListView) findViewById(R.id.listView);this.webView = (WebView) findViewById(R.id.webView);List items = new ArrayList();items.add(new Item(R.drawable.following, "Following","http://www.imdb.com/title/tt0154506/"));items.add(new Item(R.drawable.memento, "Memento","http://www.imdb.com/title/tt0209144/"));items.add(new Item(R.drawable.batman_begins, "Batman Begins","http://www.imdb.com/title/tt0372784/"));items.add(new Item(R.drawable.the_prestige, "The Prestige","http://www.imdb.com/title/tt0482571/"));items.add(new Item(R.drawable.the_dark_knight, "The Dark Knight","http://www.imdb.com/title/tt0468569/"));items.add(new Item(R.drawable.inception, "Inception","http://www.imdb.com/title/tt1375666/"));items.add(new Item(R.drawable.the_dark_knight_rises,"The Dark Knight Rises", "http://www.imdb.com/title/tt1345836/"));// Sets the data behind this ListViewthis.listView.setAdapter(new ItemAdapter(this, items));// Register a callback to be invoked when an item in this AdapterView// has been clickedlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView adapter, View view,int position, long arg) {// Sets the visibility of the indeterminate progress bar in the// titlesetProgressBarIndeterminateVisibility(true);// Show progress dialogprogressDialog = ProgressDialog.show(MainActivity.this,"ProgressDialog", "Loading!");// Tells JavaScript to open windows automatically.webView.getSettings().setJavaScriptEnabled(true);// Sets our custom WebViewClient.webView.setWebViewClient(new myWebClient());// Loads the given URLItem item = (Item) listView.getAdapter().getItem(position);webView.loadUrl(item.getUrl());}});}private class myWebClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// Load the given URL on our WebView.view.loadUrl(url);return true;}@Overridepublic void onPageFinished(WebView view, String url) {// When the page has finished loading, hide progress dialog and// progress bar in the title.super.onPageFinished(view, url);setProgressBarIndeterminateVisibility(false);progressDialog.dismiss();}}}

Por ltimo vamos a modificar el ficheroAndroidManifest.xmlde nuestra aplicacin. Definimos la actividad MainActivity como actividad principal. Para mejorar la presentacin de la aplicacin vamos a obligar que siempre se presente la vista en horizontal (landscape), para ello hemos aadido el siguiente atributo:1

Adems debemos aadir el permiso para permitir que nuestra aplicacin pueda acceder a Internet:1

NuestroAndroidManifest.xmlquedara tal que as:1234567891011121314151617181920212223242526272829

El resultado final de la aplicacin ser el siguiente:http://www.javaya.com.ar/androidya/detalleconcepto.php?codigo=138&inicio=7 - Control ListView

El control ListView a diferencia del Spinner que se cierra luego de seleccionar un elemento permanecen visibles varios elementos (se lo utiliza cuando hay que mostrar muchos elementos)Si la lista no entra en el espacio que hemos fijado para el ListView nos permite hacer scroll de los mismos.El control ListView se encuentra en la pestaa "Compositive".Problema:Disponer un ListView con los nombres de paises de sudamrica. Cuando se seleccione un pas mostrar en un TextView la cantidad de habitantes del pas seleccionado.La interfaz visual a implementar es la siguiente (primero disponemos un TextView (llamado tv1) y un ListView (llamado listView1)):

Cdigo fuente:package com.javaya.proyecto006;

import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;

public class MainActivity extends Activity {private String[] paises = { "Argentina", "Chile", "Paraguay", "Bolivia","Peru", "Ecuador", "Brasil", "Colombia", "Venezuela", "Uruguay" };private String[] habitantes = { "40000000", "17000000", "6500000","10000000", "30000000", "14000000", "183000000", "44000000","29000000", "3500000" };private TextView tv1;private ListView lv1;

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); tv1=(TextView)findViewById(R.id.tv1); lv1 =(ListView)findViewById(R.id.listView1); ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, paises); lv1.setAdapter(adapter); lv1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View v, int posicion, long id) { tv1.setText("Poblacin de "+ lv1.getItemAtPosition(posicion) + " es "+ habitantes[posicion]); } });}

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_main, menu);return true;}

}Primero definimos dos vectores paralelos donde almacenamos en uno los nombres de paises y en el otro almacenamos la cantidad de habitantes de dichos paises: private String[] paises={"Argentina","Chile","Paraguay","Bolivia","Peru", "Ecuador","Brasil","Colombia","Venezuela","Uruguay"}; private String[] habitantes={"40000000","17000000","6500000","10000000","30000000", "14000000","183000000","44000000","29000000","3500000"};Definimos un objeto de tipo TextView y otro de tipo ListView donde almacenaremos las referencias a los objetos que definimos en el archivo XML: private TextView tv1; private ListView lv1;En el mtodo onCreate obtenemos la referencia a los dos objetos:

tv1=(TextView)findViewById(R.id.tv1); lv1 =(ListView)findViewById(R.id.listView1); Creamos un objeto de la clase ArrayAdapter de forma similar a como lo hicimos cuando vimos la clase Spinner: ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, paises); lv1.setAdapter(adapter);Llamamos al mtodo setOnItemClicListener de la clase ListView y le pasamos como parmetro una clase annima que implementa la interfaz OnItemClickListener (dicha interfaz define el mtodo onItemClick que se dispara cuando seleccionamos un elemento del ListView): lv1.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View v, int posicion, long id) { tv1.setText("Poblacin de "+ lv1.getItemAtPosition(posicion) + " es "+ habitantes[posicion]); } });Dentro del mtodo onItemClick modificamos el contenido del TextView con el nombre del pas y la cantidad de habitantes de dicho pas. Este mtodo recibe en el tercer parmetro la posicin del item seleccionado del ListView.Cuando ejecutamos el proyecto podemos ver una interfaz en el emulador similar a esta:

Crear ListView Bsico enAndroidPublicado porDavid Sastre de la Torreelnoviembre 28, 2012Publicado en:Android. Etiquetado:android,ListView ArrayAdapter,ListView basico. 38 comentariosBuenas tardes, en esta entrada vamos a ver una funcin bsica de Android, muy usada, y que veremos muchas veces en muchas de las aplicaciones que usamos en el da a da, elListView.

LosListViewno son mas que unos elementos que muestran items verticalmente en una lista con scroll, para poder ir moviendonos hacia abajo y ver todos los elementos. Veremos muchas implementaciones de este tipo de elementos en muchas aplicaciones de uso diario, como puede ser la aplicacin de Twiter, WhatsApp. Para comenzar vamos a crear un proyecto en Android.

Rellenamos los datos como queramos, al fin y al cabo es una prctica y no hace falta que sea todo muy oficial. Ponemos mnimo el mnimo SDK requerido a la API 8 (Android 2.2), ya que an queda algn terminal con Android 2.2, y siguen siendo usuarios. Como mximo API podemos poner la 4.1, ya que estn abarcando el mximo mercado dentro de Android.

En la siguiente pantalla elegiremos crear una Activity, he desmarcado la opcin de crear un icono.

En la pantalla siguiente, he elegido Blank Activity, no vamos a necesitar ninguna caracterstica especial de las otras plantillas.

En esta pantalla elegimos el nombre de la Actividad, lo que nos crear tambin el nombre del layout de la actividad nueva. Con esto ya tendremos nuestra Activity creada. Ahora nos iremos al XML y aadiremos elListViewde esta manera, quedando el xml as:123456789101112

Con esto, si vamos a la parte grfica del xml podremos ver ya algo as: A continuacin nos dirigimos a nuestro archivo java, ubicado en src/nombre_paquete/EjemploListView.java (en mi caso). Vamos a comenzar declarando elListViewy un array de String con unos elementos ya predefinidos, que sern los que usaremos para rellenar elListView.123456public class EjemploListView extends Activity {private ListView list;private String[] sistemas = {"Ubuntu", "Android", "iOS", "Windows", "Mac OSX", "Google Chrome OS", "Debian", "Mandriva", "Solaris", "Unix"};

Ahora nos meteremos dentro del mtodoonCreate, para poder inicializar la lista, crear unAdapter, que es una clase la cual usaremos para rellenar elListViewy agregaremos alguna funcionalidad ms alListView.Para enlazar elListViewdel xml con la variable de instancia que hemos creado, haremos lo siguiente:12list = (ListView)findViewById(R.id.listview);

Como vemos, usamos el mtodofindViewByIdpara buscar elidque le dimos alListViewen el xml.A continuacin, vamos a declarar elAdapter. Esta clase ser la encargada de adaptar el Array que tenemos a unListView. En este caso, el adapter ser solo de ya que nuestro array solo contiene elementos de tipo String.12ArrayAdapter adaptador = new ArrayAdapter(this, android.R.layout.simple_list_item_1, sistemas);

Vamos a analizar bien elArrayAdapter. Como bien indica el nombre de la clase, es un adaptador de arrays, y en este caso de tipoString.En su constructor, pasamos como argumentos los siguientes elementos: Context: Pasamos el Context de la aplicacin, mediante el uso dethis. android.R.layout.simple_list_item_1: Esto es el tipo deListView, en nuestro caso, solo muestra un elemento, por lo tanto usaremos para cada dato un contenedor con un solo elemento. sistemas: Le pasamos el array con los SO que hemos declarado como variable de instancia que est ubicado debajo del nombre de la clase. Por ltimo estableceremos el objetoadapterde la claseArrayAdapteralListViewque hemos declarado, lo que har que cargue los datos en el y ya podamos verlo en funcionamiento.12list.setAdapter(adaptador);

Como vemos es un proceso simple, en una sola lnea. Por ltimo, vamos a agregar un listener a la lista, en este caso unonItemClickListener, que producir un aviso mediante un objetoToastcon el nmero del elemento pulsado cuando pulsemos sobre laListView. Esto podemos hacerlo de la siguiente manera.1234567891011list.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView arg0, View arg1, int position, long id) {// TODO Auto-generated method stubToast.makeText(getApplicationContext(), "Ha pulsado el item " + position, Toast.LENGTH_SHORT).show();}});

En el mtodo generado, se pasan una serie de parmetros (esto se origina solo si usamos Eclipse). En este caso el que mas nos importa es el parmetro cuyo tipo de dato esint, al cual le he cambiado el nombre para que veamos bien a que se refiere. A continuacin, creamos un Toast, el cual mostrar un aviso que nos devolver el elemento que hemos pulsado.Una vez hecho todo esto, podemos lanzar nuestra aplicacin, y ver como ha quedado todo, a continuacin pongo unas imgenes de como me ha quedado a m y un pequeo video para verlo en accin:

Aqu el vdeohttp://sekthdroid.wordpress.com/2012/11/28/crear-listview-basico-en-android/Interfaz de usuario en Android: Controles de seleccin (II)porSgolivera las07/09/2010enAndroid,ProgramacinEn elartculo anteriorya comenzamos a hablar de los controles de seleccin en Android, empezando por explicar el concepto deadaptadory describiendo el control Spinner. En este nuevo artculo nos vamos a centrar en el control de seleccin ms utilizado de todos, el ListView.Un control ListView muestra al usuario una lista de opciones seleccionables directamente sobre el propio control, sin listas emergentes como en el caso del control Spinner. En caso de existir ms opciones de las que se pueden mostrar sobre el control se podr por supuesto hacer scroll sobre la lista para acceder al resto de elementos.Para empezar, veamos como podemos aadir un control ListView a nuestra interfaz de usuario:123

Una vez ms, podremos modificar el aspecto del control utilizando las propiedades de fuente y color ya comentadas en artculos anteriores. Por su parte, para enlazar los datos con el control podemos utlizar por ejemplo el mismo cdigo queya vimospara el control Spinner. Definiremos primero un array con nuestros datos de prueba, crearemos posteriormente el adaptador de tipo ArrayAdapter y lo asignaremos finalmente al control mediante el mtodo setAdapter():12345678910final String[] datos =new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"};ArrayAdapter adaptador =new ArrayAdapter(this,android.R.layout.simple_list_item_1, datos);lstOpciones = (ListView)findViewById(R.id.LstOpciones);lstOpciones.setAdapter(adaptador);

NOTA:En caso de necesitar mostrar en la lista datos procedentes de una base de datos la mejor prctica es utilizar unLoader(concretamente unCursorLoader), que cargar los datos de forma asncrona de forma que la aplicacin no se bloquee durante la carga. Esto lo veremos ms adelante en el curso, ahora nos conformaremos con cargar datos estticos procedentes de un array.En el cdigo anterior, para mostrar los datos de cada elemento hemos utilizado otro layout genrico de Android para los controles de tipoListView(android.R.layout.simple_list_item_1), formado nicamente por unTextViewcon unas dimensiones determinadas. La lista creada quedara como se muestra en la imagen siguiente (por ejemplo para Android 2.x, aunque sera prcticamente igual en versiones ms recientes):

Como podis comprobar el uso bsico del controlListViewes completamente anlogo al ya comentado para el controlSpinner.Hasta aqu todo sencillo. Pero, y si necesitamos mostrar datos ms complejos en la lista? qu ocurre si necesitamos que cada elemento de la lista est formado a su vez por varios elementos? Pues vamos a provechar este artculo dedicado a losListViewpara ver cmo podramos conseguirlo, aunque todo lo que comentar es extensible a otros controles de seleccin.Para no complicar mucho el tema vamos a hacer que cada elemento de la lista muestre por ejemplo dos lneas de texto a modo de ttulo y subttulo con formatos diferentes (por supuesto se podran aadir muchos ms elementos, por ejemplo imgenes,checkboxes, etc).En primer lugar vamos a crear una nueva clase java para contener nuestros datos de prueba. Vamos a llamarlaTitulary tan slo va a contener dos atributos, ttulo y subttulo.1234567891011121314151617181920package net.sgoliver;public class Titular{private String titulo;private String subtitulo;public Titular(String tit, String sub){titulo = tit;subtitulo = sub;}public String getTitulo(){return titulo;}public String getSubtitulo(){return subtitulo;}}

En cada elemento de la lista queremos mostrar ambos datos, por lo que el siguiente paso ser crear un layout XML con la estructura que deseemos. En mi caso voy a mostrarlos en dos etiquetas de texto (TextView), la primera de ellas en negrita y con un tamao de letra un poco mayor. Llamaremos a este layout listitem_titular.xml:123456789101112131415161718192021

Ahora que ya tenemos creados tanto el soporte para nuestros datos como el layout que necesitamos para visualizarlos, lo siguiente que debemos hacer ser indicarle al adaptador cmo debe utilizar ambas cosas para generar nuestra interfaz de usuario final. Para ello vamos a crear nuestro propio adaptador extendiendo de la claseArrayAdapter.12345678910111213141516171819202122class AdaptadorTitulares extends ArrayAdapter {Activity context;AdaptadorTitulares(Activity context) {super(context, R.layout.listitem_titular, datos);this.context = context;}public View getView(int position, View convertView, ViewGroup parent) {LayoutInflater inflater = context.getLayoutInflater();View item = inflater.inflate(R.layout.listitem_titular, null);TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo);lblTitulo.setText(datos[position].getTitulo());TextView lblSubtitulo = (TextView)item.findViewById(R.id.LblSubTitulo);lblSubtitulo.setText(datos[position].getSubtitulo());return(item);}}

Analicemos el cdigo anterior. Lo primero que encontramos es el constructor para nuestro adaptador, al que slo pasaremos el contexto (que ser la actividad desde la que se crea el adaptador). En este constructor tan slo guardaremos el contexto para nuestro uso posterior y llamaremos al constructor padre tal como ya vimos al principio de este artculo, pasndole el ID del layout que queremos utilizar (en nuestro caso el nuevo que hemos creado, listitem_titular) y el array que contiene los datos a mostrar.Posteriormente, redefinimos el mtodo encargado de generar y rellenar con nuestros datos todos los controles necesarios de la interfaz grfica de cada elemento de la lista. Este mtodo esgetView().El mtodogetView()se llamar cada vez que haya que mostrar un elemento de la lista. Lo primero que debe hacer es inflar el layout XML que hemos creado. Esto consiste en consultar el XML de nuestro layout y crear e inicializar la estructura de objetos java equivalente. Para ello, crearemos un nuevo objeto LayoutInflater y generaremos la estructura de objetos mediante su mtodo inflate(id_layout).Tras esto, tan slo tendremos que obtener la referencia a cada una de nuestras etiquetas como siempre lo hemos hecho y asignar su texto correspondiente segn los datos de nuestro array y la posicin del elemento actual (parmetro position del mtodogetView()).Una vez tenemos definido el comportamiento de nuestro adaptador la forma de proceder en la actividad principal ser anloga a lo ya comentado, definiremos el array de datos de prueba, crearemos el adaptador y lo asignaremos al control mediantesetAdapter():1234567891011121314151617private Titular[] datos =new Titular[]{new Titular("Ttulo 1", "Subttulo largo 1"),new Titular("Ttulo 2", "Subttulo largo 2"),new Titular("Ttulo 3", "Subttulo largo 3"),new Titular("Ttulo 4", "Subttulo largo 4"),new Titular("Ttulo 5", "Subttulo largo 5")};//...//...AdaptadorTitulares adaptador =new AdaptadorTitulares(this);lstOpciones = (ListView)findViewById(R.id.LstOpciones);lstOpciones.setAdapter(adaptador);

Hecho esto, y si todo ha ido bien, nuestra nueva lista debera quedar como vemos en la imagen siguiente (esta vez lo muestro por ejemplo para Android 4.x):

Por ltimo comentemos un poco los eventos de este tipo de controles. Si quisiramos realizar cualquier accin al pulsarse sobre un elemento de la lista creada tendremos que implementar el eventoonItemClick. Veamos cmo con un ejemplo:123456789101112131415lstOpciones.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView a, View v, int position, long id) {//Alternativa 1:String opcionSeleccionada =((Titular)a.getAdapter().getItem(position)).getTitulo();//Alternativa 2://String opcionSeleccionada =// ((TextView)v.findViewById(R.id.LblTitulo))// .getText().toString();lblEtiqueta.setText("Opcin seleccionada: " + opcionSeleccionada);}});

Este evento recibe 4 parmetros: Referencia al control lista que ha recibido el click (AdapterView a). Referencia al objeto View correspondiente al tem pulsado de la lista (View v). Posicin del elemento pulsado dentro del adaptador de la lista (int position). Id del elemento pulsado (long id).Con todos estos datos, si quisiramos por ejemplo mostrar el ttulo de la opcin pulsada en la etiqueta de texto superior (lblEtiqueta) tendramos dos posibilidades:1. Acceder al adaptador de la lista mediante el mtodogetAdapter()y a partir de ste obtener mediantegetItem()el elemento cuya posicin sea position. Esto nos devolvera un objeto de tipo Titular, por lo que obtendramos el ttulo llamando a su mtodogetTitulo().2. Acceder directamente a la vista que se ha pulsado, que tendra la estructura definida en nuestro layout personalizadolistitem_titular.xml, y obtener mediantefindViewById()ygetText()el texto del control que alberga el campo ttulo.Y esto sera todo por ahora. Aunque ya sabemos utilizar y personalizar las listas en Android, en el prximo apartado daremos algunas indicaciones para utilizar de una forma mucho ms eficiente los controles de este tipo, algo que los usuarios de nuestra aplicacin agradecern enormemente al mejorarse la respuesta de la aplicacin y reducirse el consumo de batera.Puedes consultar y/o descargar el cdigo completo de los ejemplos desarrollados en este artculo accediendo a la pagina delcurso en GitHub.Aunque ya sabemos utilizar y personalizar las listas en Android, en el prximo artculo daremos algunas indicaciones para utilizar de una forma mucho ms eficiente los controles de este tipo, algo que los usuarios de nuestra aplicacin agradecern enormemente al mejorarse la respuesta de la aplicacin y reducirse el consumo de batera.http://www.sgoliver.net/blog/?p=1414Controles de seleccin en Android: ListViewEscrito porCondesa|Saturday, August 27, 2011 a las 9:49 am|35 Comentarios

En Android, utilizamos el control llamadoListViewpara desplegar una lista de opciones. En el momento en el que agregamos este control de seleccin en nuestro layout, necesitamos invocar al mtodosetAdapter()para suministrar los datos y las vistas de cada tem que contendr la lista. As como un listener a travs del mtodosetOnItemSelectedListener()para saber cundo es que se ha seleccionado una opcin. Con estos elementos, tendremos una lista de opciones funcional que podemos utilizar en nuestras aplicaciones.En el caso de que necesitemos que nuestra actividad principal despliegue solamente una lista de opciones, sera una buena idea indicar que esta sea una subclase deListActivity, en lugar de la claseActivitycomo lo hacemos regularmente.Pasando al ejemplo prctico, vamos a realizar un demo que nos despliegue una lista de opciones y que podamos capturar la opcin que el usuario seleccione cada vez que recorra la lista, y por ltimo, veremos cmo es que podemos personalizar el aspecto visual de la misma.1. Creamos un nuevo proyecto llamadoListDemocon la versin 2.2 de Android.2. Modificamos el archivomain.xmldel directoriores > layouten dnde agregaremos unTextViewque nos servir para mostrar la opcin que seleccionemos de la lista y unListViewcomo te muestro a continuacin:

3. Teniendo el layout, pasamos al cdigo Java que deber quedarte como sigue:

Explicamos el cdigo. Lo primero que hacemos es crear tres variables, una de tipoListViewque nos servir paraWas thought andadvair 150 50appreciate doesnt binhttp://www.impression2u.com/doxycycline-over-the-counter/and. You bealbendazole 400 mgthicker show microdermabrasions skin looking. Thanhttp://www.louisedodds.com/cytotec-drug-in-philippinesT: from use asonline pharmacy india paypalnot a simplyhttp://www.louisedodds.com/noprescriptioneeded-prescription-drugsthey smoothly appliedhttp://memenu.com/xol/canadian-drugs-generic-viagra.htmlhaircuts it hadmethocarbamol without a prescriptionfine started smaller Too, itsafe cheap viagra sites onlineupgrading . Assumedorder atarax onlinereally hair better abouthttp://www.magoulas.com/sara/flagyl-medication.phpLavender girlfriend least stabcanadianpharmacynoprescriptionneededsmooth, it find at.manipular la lista de opciones; la segunda variable ser de tipoTextViewpara asignarle a este control las opciones que vayamos seleccionando cada vez; y la tercera que corresponde a un array de Strings con las opciones que queremos que tenga la lista.Despus, dentro del mtodoonCreate()recuperamos elListViewy elTextViewdefinidos en el XML en las variables declaradas lneas arriba. Paso siguiente es llenar la lista con las opciones, para lo cul llamamos al mtodosetAdapter()que recibe como parmetros el contexto en el cul se est utilizando la lista (this), el nombre del recurso que define el aspecto visual de la lista (en este caso hacemos uso de un layout predefinido por Android:android.R.layout.simple_list_item_1) y por ltimo, el arreglo de datos que en este caso definimos en la variabledatos.Posteriormente, lo nico que hacemos es asignarle a la variablelvun listener que nos permitir definir una accin que responda al evento de seleccionar un tem de la lista. En este caso, lo que hacemos es indicar que se nos muestre el texto de la opcin en elTextView.4. Ejecutamos nuestro ejemplo y vemos lo que pasa:

Habr veces en las que el aspecto visual por default que Android nos brinda no nos sea suficiente y queramos personalizar un poco ms nuestras aplicaciones. As que modificaremos nuestro ejemplo para que veas cmo se hace y puedas dar rienda suelta a tus habilidades de diseador.5. Vamos a crear un nuevo archivo XML dentro del directoriores > layoutllamadolist_item.xmlque contendr nicamente un elementoTextViewque representa cada tem en la lista.

6. Ahora para que nuestra lista tome el layout definido en este nuevo archivo nicamente tendremos que sustituir la lnea:

Por la siguiente lnea en dnde mandamos a llamar al recurso de layoutlist_item.

7. Volvemos a correr nuestro ejemplo y veremos claramente que el aspecto visual de nuestra lista ha cambiado:

Este es tan slo un pequeo ejemplo de lo que podemos hacer con las listas y con su personalizacin. Las posibilidades son muchas y todo depende de tu creatividad. Si quieres conocer ms acerca de los atributos que nos permiten personalizar tipos de letra y diseos sobre los textos puedes consultareste artculo.Descrgate el cdigo fuente de este tutorial:http://androideity.com/2011/08/27/controles-de-seleccion-en-android-listas/Programacin Android, ListView & Adapter personalizado IPosted on30 agosto 2013byIAvilaEAhora que hemos empezado a manejar adaptadores y listas con elSpinner, vamos a dar un paso ms, utilizando el controlListViewy gestionando su contenido con unAdapterpersonalizado, de manera que lo que visualicemos en cada celda de la lista est diseado por nosotros mismos.Creando el ListViewEn primer lugar debemos crear nuestro interfaz de usuario. Lgicamente debemos aadir unListView, en el que mostraremos los datos que queramos, y en nuestro caso vamos a incorporar en la parte superior algunosTextViewque indicarn el n de la celda que ocupa el tem seleccionado delListViewy el texto que contenga.Quedara as:

Layout ListView

La forma en que asignaremos el Adapter a nuestroListViewes exactamente igual que como lo hicimos en elejemplo del Spinner, sin embargo en esta ocasin dijimos que usaramos uno personalizado, por lo que por un ladotendremos que crear una vista de cada tem delListView, que ser la base que utilicemos para poder mostrar los datos, y por otronuestra propia clase que acte como Adapter.Creando la vista del tem del ListViewPara este ejemplo voy a continuar con la idea que desarrollamos en elSpinner, usando animales para mostrar en elListView, y mostraremos la foto del animal en cuestin, el nombre y el nmero de celda que est ocupando en elListView. En primer lugar vamos a crear un nuevo layout para el tem delListView, quedara as:

tem del ListView

Creando la estructura de datosY a continuacin crearemos en Java, en la Activity Main,la coleccin de animales que querremos mostrar en elListView. En esta ocasin utilizaremos algunos animales ms, para poder llenar elListViewcon ms celdas, y para poder mostrar las imgenes tendremos que incorporarlas a los recursos de nuestro proyecto, creando una carpeta drawables en la que las guardaremos. Para que resulte ms sencillo podrn descargarse las imgenes usadas en este ejemploaqu.Al igual que en el ejemplo delSpinner, vamos a utilizar unstring-arrayque definiremos como recursos en el xml, pero en lugar de utilizar unTreeMapcomo hicimos en elSpinner, en esta ocasinvamos a crear una clase modeloque nos sirva para guardar nombre y foto del animal, y este objeto lo almacenaremos en unArrayList. El motivo por el que en esta ocasin utilizamos este mtodo es que el Adapter necesita una coleccin queimplemente la interfazList, cosa que no sucede con elTreeMapy s con elArrayList.En primer lugar creamos la clase modelo, llamada Animal, y que contendr un campoStringen el que poner el nombre y otrointen el que poner la imagen. Utilizamos unintya que al estar las imgenes almacenadas en la carpeta drawables podremos acceder al recurso a travs de su id (int), de manera que no necesitaremos almacenar unBitmap, lo que necesitara ms memoria y por lo tanto hara innecesariamente ms pesada nuestra aplicacin, y adems veremos posteriormente que podemos asignar la imagen alImageViewdirectamente con este valor, utilizando uno de sus mtodos.La clase Animal quedara as:public class Animal {private String nombre;private int drawableImageID;

public Animal(String nombre, int drawableImageID) {this.nombre = nombre;this.drawableImageID = drawableImageID;}

public String getNombre() {return nombre;}

public void setNombre(String nombre) {this.nombre = nombre;}

public int getDrawableImageID() {return drawableImageID;}

public void setDrawableImageID(int drawableImageID) {this.drawableImageID = drawableImageID;}

}Ahora tendremos que declarar en nuestraActivityunArrayList:private ArrayList animales;Esta variable la inicializaremos en el mtodoonCreatede nuestraActivity, y rellenaremos los datosutilizando un mtodo, para que nuestroonCreateno quede sobrecargado de datos. El mtodo quedara as:private void rellenarArrayList() {animales.add(new Animal("aguila", R.drawable.aguila));animales.add(new Animal("ballena", R.drawable.ballena));animales.add(new Animal("caballo", R.drawable.caballo));animales.add(new Animal("camaleon", R.drawable.camaleon));animales.add(new Animal("canario", R.drawable.canario));animales.add(new Animal("cerdo", R.drawable.cerdo));animales.add(new Animal("delfin", R.drawable.delfin));animales.add(new Animal("gato", R.drawable.gato));animales.add(new Animal("iguana", R.drawable.iguana));animales.add(new Animal("lince", R.drawable.lince));animales.add(new Animal("lobo", R.drawable.lobo_9));animales.add(new Animal("morena", R.drawable.morena));animales.add(new Animal("orca", R.drawable.orca));animales.add(new Animal("perro", R.drawable.perro));animales.add(new Animal("vaca", R.drawable.vaca));}Creando el AdapterUna vez que ya tenemos la coleccin de datos creada, ya podemos empezar a crear nuestro Adapter. El Adapter que vamos a utilizar es una nueva clase que crearemos, pero queva a extender de la claseArrayAdapter, que ya implementa los mtodos que nuestra clase necesita, y slo tendremos que sobreescribir uno de ellos. La firma de esta clase sera:public class AnimalesAdapter extends ArrayAdapterComo hemos dicho, esta clase extiende deArrayAdapter, pero tambin se puede ver que hemosparametrizadoelArrayAdaptercon la clase modelo que nosotros hemos creado. En realidad esto no es necesario, pero s es conveniente, ya que luego vamos a manejar una coleccin de datos, y al parametrizar en este punto haremos que la coleccin que se utilice posteriormente obligatoriamente sea del tipo aqu indicado. Es decir, si por accidente intentamos decir que utilice unArrayListnos dar fallo, porque no estamos preparando nuestra clase para ese tipo de coleccin.En esta clase necesitaremos crear dos variables, una de tipoContext, que ser la que utilicemos para inflar las vistas que mostraremos en cada celda delListView, y unArrayListen el que guardar la coleccin de datos:private Context context;private ArrayList datos;Estas variables las inicializaremos en el constructor:public AnimalesAdapter(Context context, ArrayList datos) {super(context, R.layout.listview_item, datos);// Guardamos los parmetros en variables de clase.this.context = context;this.datos = datos;}Como podemos ver en el constructor estamos haciendo una llamada asuper(). Recordemos que es la llamada al constructor de la clase que est por encima de la nuestra (de la que hemos extendido, que en este caso esArrayAdapter).ArrayAdaptertiene varios constructores distintos, sin embargo para nuestros propsitos el que hemos utilizado es el que mejor nos viene. Como podemos ver hemos pasado a super elContext, la coleccin de datos y adems hemos pasadola referencia al layoutque creamos para la vista de cada celda delListView.Una vez que tenemos creado ya el constructor e inicializadas las variables pasamos al mtodo realmente importante de esta clase. El mtodogetView()es el que realmente se encarga de inflar y mostrar las vistas de cada celda delListView. ste es un mtodo que est ya implementado en la claseArrayAdapter, pero quenos obliga a sobreescribir en nuestra clase:@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// En primer lugar "inflamos" una nueva vista, que ser la que se// mostrar en la celda del ListView. Para ello primero creamos el// inflater, y despus inflamos la vista.LayoutInflater inflater = LayoutInflater.from(context);View item = inflater.inflate(R.layout.listview_item, null);

// A partir de la vista, recogeremos los controles que contiene para// poder manipularlos.// Recogemos el ImageView y le asignamos una foto.ImageView imagen = (ImageView) item.findViewById(R.id.imgAnimal);imagen.setImageResource(datos.get(position).getDrawableImageID());

// Recogemos el TextView para mostrar el nombre y establecemos el// nombre.TextView nombre = (TextView) item.findViewById(R.id.tvContent);nombre.setText(datos.get(position).getNombre());

// Recogemos el TextView para mostrar el nmero de celda y lo// establecemos.TextView numCelda = (TextView) item.findViewById(R.id.tvField);numCelda.setText(String.valueOf(position));

// Devolvemos la vista para que se muestre en el ListView.return item;}Como hemos visto en el cdigo, lo primero que debemos hacer es inflar la vista, y para ello utilizamos un objeto de la claseLayoutInflatery para inicializarlo hemos necesitado el context que nos vino desde el constructor. Esespecialmente importanteque el context que recibamos sea realmente el de laActivityque maneja elListView, ya que si no es as al ejecutar la aplicacin nuestroListViewquedar como apagado, y no permitir que se visualice del todo bien.Despus hemos creado un objeto de la claseView, y lo hemos inicializado a partir de nuestro inflater. El inflater ha utilizado dos parmetros, el primero apunta a la referencia alLayoutque creamos para elListView, y el segundo hace referencia a la vista que ser padre de la nuestra. Como en este caso no hay ningnLayoutque vaya a contener a este, sino que directamente lo vamos a introducir en elListView, pasamosnullcomo segundo parmetro.Una vez creada nuestra vista empezaremos a asignar los valores a losTextViewy alImageView. Para hacerlo vemos que es muy similar a como lo hemos hecho en lasActivityque hemos configurado hasta ahora, pero hay que prestar especial atencin a como inicializamos las variables:ImageView imagen = (ImageView) item.findViewById(R.id.imgAnimal);TextView nombre = (TextView) item.findViewById(R.id.tvContent);TextView numCelda = (TextView) item.findViewById(R.id.tvField);Podemos ver que en esta ocasin en lugar de poner el mtodofindViewById()directamente lo hemos hechoa partir del objetoViewque creamos. Esto es as en primer lugar porque este mtodo no se encuentra en la claseArrayAdapter, y en segundo lugar porque losTextViewy elImageViewa los que queremos acceder realmentese