En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
Proyecto Android con Content Providers (I)
3.
Proyecto Android con Content Providers (I)
Vamos a desarrollar un proyecto que nos sirva de ejemplo práctico para la utilización de Content Providers en una aplicación Android. Esta nos permitirá acceder a diferentes modelos de datos que proporciona Android, a través de varios Content Providers ya definidos, proporcionando acceso al registro de llamadas, a la agenda de contactos y a los mensajes de texto almacenados en el dispositivo móvil.
Enumeramos en primer lugar los elementos necesarios para el desarrollo del proyecto, así como la lógica de acceso de las Activities, y continuaremos presentando la estructura del proyecto y su código fuente detallado.
Este proyecto, que denominaremos «ProviderAndroid«, lo publicaremos en dos entregas debido a su extensión. Podrás descargar el código completo en la segunda parte.
Elementos Proyecto ProviderAndroid
- Una clase MainActivity, que herede de la clase base Activity, que construye la lógica de navegación entre las diferentes Activities definidas.
- Tres Activities, que hereden de la clase base ListActivity, encargadas de mostrar los diferentes modelos de datos que proporciona Android para el acceso al registro de llamadas, la agenda de contactos y los mensajes SMS almacenados.
- Tres clases adaptadores, que hereden de la clase base BaseAdapter, para la construcción de las vistas de cada uno de los ítems, que formarán los diferentes componentes de tipo selección ListView.
- Tres clases (Contactos, Llamadas y Mensajes) que permitan crear nuevos objetos, con los datos de cada registro del Content Provider proporcionado por Android, asociado a los diferentes modelos de datos (métodos getters y setters).
- Un layout principal, formado por tres componentes de tipo Button para navegar entre las diferentes pantallas de la aplicación, y tres layout que construirán las diferentes listas asociadas al registro de llamadas, la agenda de contactos y los mensajes de texto almacenados. Además en cada uno de estos tres layout se implementan dos componentes de tipo Button para actualizar y eliminar registros.
- Se crean tres layout personalizados que construirán los ítems de cada ListView definido. Estarán formados por tres componentes de tipo TextView cada uno.
Lógica de acceso
Mostramos en el siguiente diagrama, la lógica de acceso a las diferentes Activities que muestran información de los Contents Providers definidos en Android (pincha en la imagen para ampliarla):
Estructura del proyecto
Aquí presentamos la estructura del proyecto ProviderAndroid, con todas las clases y layouts que implementaremos y que detallaremos en el siguiente apartado:
Documentación código fuente
A continuación presentaremos todo el código del proyecto. Como hemos indicado al principio, este proyecto lo publicamos en dos entregas. En esta primera publicación veremos todas las clases que utilizaremos en el proyecto y en la segunda parte, presentaremos todos los layouts, con las vistas y elementos visuales de la aplicación. También en esa 2ª parte, podrás descargar el código completo del proyecto.
Comenzamos pues a describir cada una de las clases del proyecto, mostrando la pantalla de la activity correspondiente:
ProviderAndroid\src\com\academiaandroid\providerandroid\MainActivity.java
- Se define una clase llamada MainActivity, que hereda de la clase base Activity, encargada de construir la lógica de navegación entre Activities:
12public class MainActivity extends Activity { - Se implementan tres eventos onClick(), responsables de lanzar las diferentes Activities que mostrarán el registro de llamadas, la agenda de contactos y los sms almacenados:
123456789101112131415161718192021/*Evento onClick() que lanzará la Activity encargada de mostrar el registro de llamadas almacenadas.*/public void mostrarRegistroLlamadas(View view){Intent intent = new Intent(this,RegistroLlamadas.class);startActivity(intent);}/*Evento onClick() que lanzará la Activity encargada de mostrar los mensajes de texto almacenados.*/public void mostrarMensajesTexto(View view){Intent intent = new Intent(this,MensajesTexto.class);startActivity(intent);}/*Evento onClick() que lanzará la Activity encargada de mostrar los contactos guardados en el dispositivo.*/public void mostrarContactos(View view){Intent intent = new Intent(this,ContactosAgenda.class);startActivity(intent);}
ProviderAndroid\src\com\academiaandroid\providerandroid\RegistroLlamadas.java
- Se implementa una nueva clase llamada RegistroLlamadas, que hereda de la clase base ListActivity, encargada de mostrar el registro de llamadas (salientes, entrantes y perdidas) en un componente de tipo ListView:
12public class RegistroLlamadas extends ListActivity { - Se declaran tanto un componente de tipo ListView, como dos componentes de tipo TextView para mostrar información relativa al registro de llamadas. Además se construye un Array de Strings, para acceder a las columnas con el tipo de llamada, número de teléfono y fecha de la llamada:
1234private ListView listaLlamadas;private TextView txtContadorLlamadas, txtLlamadaSeleccionada;String[] columnas = new String[]{Calls.TYPE, Calls.NUMBER, Calls.DATE}; - Se enlazan los componentes con sus recursos a nivel de layout:
1234listaLlamadas = (ListView)findViewById(android.R.id.list);txtContadorLlamadas = (TextView)findViewById(R.id.txtTotalLlamadas);txtLlamadaSeleccionada = (TextView)findViewById(R.id.txtLlamadaSeleccionada); - Se invoca al método
setAdapter()
, recibiendo como argumento la instancia de la clase AdaptadorLlamadas(), cuyo constructor está compuesto por el contexto y un ArrayList de objetos Llamadas, que devuelve el método registroLlamadas():
12listaLlamadas.setAdapter(new AdaptadorLlamadas(this, registroLlamadas())); - Se implementa un método llamado
registroLlamadas()
, que devolverá un ArrayList de objetos Llamadas, encargado de mostrar las llamadas almacenadas en un Content Provider proporcionado por Android. Se utiliza la clase ContentResolver para acceder al modelo de datos:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869public ArrayList<Llamadas> registroLlamadas(){ArrayList<Llamadas> lista = new ArrayList<Llamadas>();try{Llamadas llamadas = null;Uri identificadorLlamadas = Calls.CONTENT_URI;/*Se declara e inicializa la clase ContentResolver, referenciándole el método getContentResolver(),que proporciona el acceso a los datos del Content Provider.*/ContentResolver cr = getContentResolver();cursor = cr.query(identificadorLlamadas, columnas, null, null, null);int columTipo, columNumero, columFecha = 0;if(cursor != null){/*Se recorrerán los resultados almacenados de la consulta en el objetoCursor, comprobando en cada iteración que existe el registro siguiente.*/if(cursor.moveToFirst()){columTipo = cursor.getColumnIndex(Calls.TYPE);columNumero = cursor.getColumnIndex(Calls.NUMBER);/*Los datos de la columna Date de la tabla Calls se definen en milisegundos*/columFecha = cursor.getColumnIndex(Calls.DATE);int tipoLlamada = 0;String numeroLlamada = null;long fechaLlamada = 0;String llamadaTipo = null;do{tipoLlamada = cursor.getInt(columTipo);numeroLlamada = cursor.getString(columNumero);fechaLlamada = cursor.getLong(columFecha);/*Se controla el tipo de llamada para asignarle los valores de 'Entrante', 'Perdida' o'Saliente'.*/if(tipoLlamada == Calls.INCOMING_TYPE){llamadaTipo = "Entrante";}else if(tipoLlamada == Calls.MISSED_TYPE){llamadaTipo = "Perdida";}else if(tipoLlamada == Calls.OUTGOING_TYPE){llamadaTipo = "Saliente";}/*Se crea un objeto de la clase Llamadas por cada iteración, con los valores de tipo dellamada, número y fecha (se convierte la fecha de milisegundos al formato HH:mm:ss dd-MM-YYYY).*/llamadas = new Llamadas(llamadaTipo, numeroLlamada, convertirFecha(fechaLlamada));lista.add(llamadas);}while(cursor.moveToNext());}}}catch(Exception ex){ex.getMessage();}finally{if(cursor != null){cursor.close();}}return lista;} - Se define un evento onClick() llamado
borrarLlamada(View view)
, que permite borrar una llamada seleccionada por el usuario, a partir del número de teléfono:
123456789101112131415161718public void borrarLlamada(View view){/*Se establece la condición de que el usuario seleccione una llamada antes de poder eliminarla. */if(txtLlamadaSeleccionada.getText().toString().equals("Sin datos")){Toast.makeText(RegistroLlamadas.this, "Debe seleccionar una llamada para eliminar", Toast.LENGTH_LONG).show();}else{ContentResolver resolver = getContentResolver();String numero_llamada = txtLlamadaSeleccionada.getText().toString();/*Se invoca al método delete(), recibiendo entre sus argumentos la URI que identifica al Content Provider,y la condición a través de la cláusula WHERE.*/resolver.delete(CallLog.Calls.CONTENT_URI, CallLog.Calls.NUMBER + " = '" + numero_llamada + "'", null);Toast.makeText(RegistroLlamadas.this, "Registro Llamada borrada: " + numero_llamada, Toast.LENGTH_LONG).show();onCreate(bundle);}} - Se construye un método llamado
convertirFecha(long date)
, que recibe como parámetros de entrada un dato de tipo long, que proporciona la lógica para el formateo de la fecha y hora de cada llamada. Este método será invocado desde diferentes Activities para formatear las diferentes fechas mostradas:
12345678public static String convertirFecha(long date){SimpleDateFormat formatFecha = new SimpleDateFormat("HH:mm:ss dd-MM-yyyy");formatFecha.setTimeZone(TimeZone.getTimeZone("GMT"));String fecha = formatFecha.format(new Date(date));return fecha;}
ProviderAndroid\src\com\academiaandroid\providerandroid\MensajesTexto.java
- Se implementa una clase llamada MensajesTexto, que hereda de la clase base ListActivity, encargada de mostrar los mensajes SMS almacenados (salientes y entrantes) en un componente de tipo ListView:
12public class MensajesTexto extends ListActivity { - Se declaran los componentes visuales de la interfaz de usuario, formados por un componente ListView, que mostrará la lista de SMS almacenados, un componente de tipo TextView, encargado de controlar el número de mensajes almacenados, y un componente de tipo EditText (no editable), donde se visualizará el contenido del mensaje que seleccione el usuario. Además se construye un array de Strings, con las columnas de tipo, número, fecha y contenido de la tabla Sms de cada mensaje:
12345private ListView listaMensajes;private TextView txtTotalSMS;private EditText edContenidoSMS;String[] columnas = new String[]{Sms.TYPE, Sms.ADDRESS, Sms.DATE, Sms.BODY}; - Se enlazan los componentes con sus recursos a nivel de layout:
1234listaMensajes = (ListView)findViewById(android.R.id.list);edContenidoSMS = (EditText)findViewById(R.id.edContenidoSMS);txtTotalSMS = (TextView)findViewById(R.id.txtTotalSMS); - Se invoca al método
setAdapter()
, recibiendo como argumento la instancia de la clase
AdaptadorSMS(), cuyo constructor está compuesto por el contexto y un ArrayList de objetos Mensajes,que devuelve el método mostrarListaSMS():
12listaMensajes.setAdapter(new AdaptadorSMS(this, mostrarListaSMS())); - Se construye el método
mostrarListaSMS()
, que devolverá un ArrayList de objetos Mensajes, encargado de mostrar los SMS almacenados en un Content Provider proporcionado por Android. Se utiliza la clase ContentResolver para acceder al modelo de datos:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869private ArrayList<Mensajes> mostrarListaSMS(){ArrayList<Mensajes> arrayMensajes = new ArrayList<Mensajes>();try{Mensajes mensajes = null;Uri identificadorMensajesTexto = Sms.CONTENT_URI;/*Se declara e inicializa la clase ContentResolver, referenciándole el método getContentResolver(),que proporciona el acceso a los datos del Content Provider.*/ContentResolver cr = getContentResolver();cursor = cr.query(identificadorMensajesTexto, columnas, null, null, null);int columTipoSMS, columNumeroSMS, columFechaSMS, columContenido = 0;if(cursor != null){/*Se recorrerán los resultados almacenados de la consulta en el objetoCursor, comprobando en cada iteración que existe el registro siguiente.*/if(cursor.moveToFirst()){columTipoSMS = cursor.getColumnIndex(Sms.TYPE);columNumeroSMS = cursor.getColumnIndex(Sms.ADDRESS);/*Los datos de la columna Date de la tabla Sms se definen en milisegundos*/columFechaSMS = cursor.getColumnIndex(Sms.DATE);columContenido = cursor.getColumnIndex(Sms.BODY);int tipoSMS = 0;String numeroSMS = null;long fechaSMS = 0;String smsTipo = null;String smsContenido = null;do{tipoSMS = cursor.getInt(columTipoSMS);numeroSMS = cursor.getString(columNumeroSMS);fechaSMS = cursor.getLong(columFechaSMS);smsContenido = cursor.getString(columContenido);/*Se controla el tipo de mensaje para asignarle los valores de 'Mensaje saliente' o'Mensaje entrante'.*/if(tipoSMS == Sms.MESSAGE_TYPE_SENT){smsTipo = "Mensaje saliente";}else if(tipoSMS == Sms.MESSAGE_TYPE_INBOX){smsTipo = "Mensaje entrante";}/*Se crea un objeto de la clase Mensajes por cada iteración, con los valores de tipo deSMS, número, fecha (se convierte la fecha de milisegundos al formato HH:mm:ss dd-MM-YYYY) ycontenido del SMS.*/mensajes = new Mensajes(smsTipo, numeroSMS, RegistroLlamadas.convertirFecha(fechaSMS), smsContenido);arrayMensajes.add(mensajes);}while(cursor.moveToNext());}}}catch(Exception ex){ex.getMessage();}finally{if(cursor != null){cursor.close();}}return arrayMensajes;} - Evento onClick()
borrarSMS(View view)
, que permite borrar una SMS seleccionado por el usuario, a partir del contenido mostrado:
123456789101112131415161718public void borrarSMS(View view){/*Se establece la condición de que el usuario seleccione un mensaje antes de poder eliminarlo. */if(edContenidoSMS.getText().toString().equals("Sin datos")){Toast.makeText(MensajesTexto.this, "Debe seleccionar un SMS para eliminar", Toast.LENGTH_LONG).show();}else{ContentResolver resolver = getContentResolver();String cuerpo_mensaje = edContenidoSMS.getText().toString();/*Se invoca al método delete(), recibiendo entre sus argumentos la URI que identifica al Content Provider,y la condición a través de la cláusula WHERE.*/resolver.delete(Sms.CONTENT_URI, Sms.BODY + " = '" + cuerpo_mensaje + "'", null);Toast.makeText(MensajesTexto.this, "Mensaje borrado: " + cuerpo_mensaje, Toast.LENGTH_LONG).show();onCreate(bundle);}}
ProviderAndroid\src\com\academiaandroid\providerandroid\ContactosAgenda.java
- Se implementa una nueva clase llamada ContactosAgenda, que hereda de la clase base ListActivity, encargada de mostrar los contactos almacenados en un componente de tipo ListView:
12public class ContactosAgenda extends ListActivity { - Se declaran tanto un componente de tipo ListView, como dos componentes de tipo TextView para mostrar información relativa a los datos de cada contacto almacenado. Además se construye un Array de Strings, para acceder a las columnas con el tipo, datos y número de teléfono del contacto:
1234private ListView listaContactos;private TextView txtTotalContactos, txtContactoSeleccionado;String[] columnas = new String[]{Phone.TYPE, Phone.DISPLAY_NAME, Phone.NUMBER}; - Se enlazan los componentes con sus recursos a nivel de layout:
1234listaContactos = (ListView)findViewById(android.R.id.list);txtTotalContactos = (TextView)findViewById(R.id.txtTotalContactos);txtContactoSeleccionado = (TextView)findViewById(R.id.txtContactoSeleccionado); - Se invoca al método
setAdapter()
, recibiendo como argumento la instancia de la clasenew AdaptadorContactos()
, cuyo constructor está compuesto por el contexto y un ArrayList de objetos Contactos, que devuelve el métodoregistroContactos()
:
12listaContactos.setAdapter(new AdaptadorContactos(this, registroContactos())); - Se implementa un método llamado
registroContactos()
, que devolverá un ArrayList de objetos Contactos, encargado de mostrar los contactos almacenados en un Content Provider proporcionado por Android. Se utiliza la clase ContentResolver para acceder al modelo de datos:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566private ArrayList<Contactos> registroContactos() {ArrayList<Contactos> arrayContactos = new ArrayList<Contactos>();try{Contactos contactos = null;Uri identificadorContactos = Phone.CONTENT_URI;/*Se declara e inicializa la clase ContentResolver, referenciándole el método getContentResolver(),que proporciona el acceso a los datos del Content Provider.*/ContentResolver cr = getContentResolver();cursor = cr.query(identificadorContactos, columnas, null, null, null);int columDatos, columNumero, columTipo = 0;if(cursor != null){/*Se recorrerán los resultados almacenados de la consulta en el objetoCursor, comprobando en cada iteración que existe el registro siguiente.*/if(cursor.moveToFirst()){columTipo = cursor.getColumnIndex(Phone.TYPE);columDatos = cursor.getColumnIndex(Phone.DISPLAY_NAME);columNumero = cursor.getColumnIndex(Phone.NUMBER);int tipoContacto = 0;String numeroContacto = null;String datosContacto = null;String contactoTipo = null;do{tipoContacto = cursor.getInt(columTipo);numeroContacto = cursor.getString(columNumero);datosContacto = cursor.getString(columDatos);/*Se controla el tipo de contacto para asignarle los valores de 'Teléfono Casa' o'Teléfono móvil'.*/if(tipoContacto == Phone.TYPE_HOME){contactoTipo = "Teléfono Casa";}else if(tipoContacto == Phone.TYPE_MOBILE){contactoTipo = "Teléfono móvil";}/*Se crea un objeto de la clase Contactos por cada iteración, con los valores de tipo,datos y número de contacto.*/contactos = new Contactos(contactoTipo, datosContacto, numeroContacto);arrayContactos.add(contactos);}while(cursor.moveToNext());}}}catch(Exception ex){ex.getMessage();}finally{if(cursor != null){cursor.close();}}return arrayContactos;} - Se define un evento onClick() llamado
borrarContacto(View view)
, que permite borrar un contacto seleccionado por el usuario, a partir de los datos del mismo:
12345678910111213141516public void borrarContacto(View view){if(txtContactoSeleccionado.getText().toString().equals("Sin datos")){Toast.makeText(ContactosAgenda.this, "Debe seleccionar un contacto para eliminar", Toast.LENGTH_LONG).show();}else{ContentResolver resolver = getContentResolver();Log.i("borrarContacto", Contacts.DISPLAY_NAME + " = '" + txtContactoSeleccionado.getText().toString() + "'");String datos_contacto = txtContactoSeleccionado.getText().toString();resolver.delete(RawContacts.CONTENT_URI, Contacts.DISPLAY_NAME + " = '" + datos_contacto + "'", null);Toast.makeText(ContactosAgenda.this, "Datos contacto borrado: " + datos_contacto, Toast.LENGTH_LONG).show();onCreate(bundle);}}
ProviderAndroid\src\com\academiaandroid\providerandroid\Llamadas.java
1.Se define una clase Llamadas, que permitirá crear nuevos objetos, con los datos de cada registro del Content Provider proporcionado por Android, asociado a las llamadas registradas (métodos getters y setters):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Llamadas { private String tipo; private String numero; private String fecha; public Llamadas(String tipo, String numero, String fecha) { this.tipo = tipo; this.numero = numero; this.fecha = fecha; } [...] } |
ProviderAndroid\src\com\academiaandroid\providerandroid\Mensajes.java
1.Se define una clase Mensajes, que permitirá crear nuevos objetos, con los datos de cada registro del Content Provider proporcionado por Android, asociado a los mensajes de texto almacenados en el dispositivo (métodos getters y setters):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Mensajes { private String tipo; private String numero; private String fecha; private String contenido; public Mensajes(String tipo, String numero, String fecha, String contenido) { this.tipo = tipo; this.numero = numero; this.fecha = fecha; this.contenido = contenido; } [...] } |
ProviderAndroid\src\com\academiaandroid\providerandroid\Contactos.java
1.Se define una clase Contactos, que permitirá crear nuevos objetos, con los datos de cada registro del Content Provider proporcionado por Android, asociado a la agenda de contactos almacenados en el dispositivo (métodos getters y setters):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Contactos { private String tipo; private String datos; private String numero; public Contactos(String tipo, String datos, String numero) { this.tipo = tipo; this.datos = datos; this.numero = numero; } [...] } |
ProviderAndroid\src\com\academiaandroid\providerandroid\AdaptadorLlamadas.java
- Se añade una clase llamada AdaptadorLlamadas, que hereda de la clase base BaseAdapter, encargada de construir la vista de cada uno de los ítems que se mostrarán en el componente ListView, con el registro de llamadas:
12public class AdaptadorLlamadas extends BaseAdapter { - Por último se construye la vista por cada ítem, sobrescribiendo el método getView() (devuelve un objeto de tipo View), a partir del ArrayList recibido y la posición que ocupa:
123456789101112131415161718192021222324252627@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View v = convertView;ViewHolderContactos vista = new ViewHolderContactos();if(convertView == null){v = inflater.inflate(R.layout.activity_adaptador_contactos, parent, false);/*Se asocian los controles de tipo TextView con sus recursos a nivel de layout.*/vista.txtTipoContacto = (TextView)v.findViewById(R.id.txtTipoContacto);vista.txtDatosContacto = (TextView)v.findViewById(R.id.txtDatosContacto);vista.txtNumeroContacto = (TextView)v.findViewById(R.id.txtNumeroContacto);/*Se asignan a cada componente el índice de la columna a mostrar, a partir de los resultados de la consulta procesada. En cada ítem del componente de selección ListView se mostrarán el tipo, el teléfono y la fecha de la llamada.*/vista.txtTipoContacto.setText("Tipo de contacto: " + contactos.get(position).getTipo() + "| ");vista.txtDatosContacto.setText("Datos contacto: " + contactos.get(position).getDatos() + "| ");vista.txtNumeroContacto.setText("Teléfono contacto: " + contactos.get(position).getNumero() + "| ");}else{vista = (ViewHolderContactos) v.getTag();}return v;}
ProviderAndroid\src\com\academiaandroid\providerandroid\AdaptadorSMS.java
- Se añade una clase llamada AdaptadorSMS, que hereda de la clase base BaseAdapter, encargada de construir la vista de cada uno de los ítems que se mostrarán en el componente ListView, con los mensajes de texto almacenados en el dispositivo:
12public class AdaptadorSMS extends BaseAdapter { - A través del método
getView(int position, View convertView, ViewGroup parent)
, se construye la vista por cada ítem, y se sobrescribe dicho método (devuelve un objeto de tipo View), a partir del ArrayList recibido y la posición que ocupa:
1234567891011121314151617181920212223242526@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View v = convertView;ViewHolderMensajes vista = new ViewHolderMensajes();if(convertView == null){v = inflater.inflate(R.layout.activity_adaptador_mensajes, parent, false);/*Se asocian los controles de tipo TextView con sus recursos a nivel de layout.*/vista.txtTipoSMS = (TextView)v.findViewById(R.id.txtTipoSMS);vista.txtNumeroSMS = (TextView)v.findViewById(R.id.txtNumeroSMS);vista.txtFechaSMS = (TextView)v.findViewById(R.id.txtFechaSMS);/*Se asignan a cada componente el índice de la columna a mostrar, a partir de los resultados de la consulta procesada. En cada ítem del componente de selección ListView se mostrarán el tipo, el teléfono y la fecha del SMS almacenado.*/vista.txtTipoSMS.setText("Tipo de SMS: " + mensajes.get(position).getTipo() + " | ");vista.txtNumeroSMS.setText("Número: " + mensajes.get(position).getNumero() + "| ");vista.txtFechaSMS.setText("Fecha: " + mensajes.get(position).getFecha() + "| ");}else{vista = (ViewHolderMensajes) v.getTag();}return v;}
ProviderAndroid\src\com\academiaandroid\providerandroid\AdaptadorContactos.java
- Se añade una clase llamada AdaptadorContactos, que hereda de la clase base BaseAdapter, encargada de construir la vista de cada uno de los ítems que se mostrarán en el componente ListView, con la agenda de contactos del dispositivo:
12public class AdaptadorContactos extends BaseAdapter { - Por último se construye la vista por cada ítem, sobrescribiendo el método getView() (devuelve un objeto de tipo View), a partir del ArrayList recibido y la posición que ocupa:
1234567891011121314151617181920212223242526@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View v = convertView;ViewHolderMensajes vista = new ViewHolderMensajes();if(convertView == null){v = inflater.inflate(R.layout.activity_adaptador_mensajes, parent, false);/*Se asocian los controles de tipo TextView con sus recursos a nivel de layout.*/vista.txtTipoSMS = (TextView)v.findViewById(R.id.txtTipoSMS);vista.txtNumeroSMS = (TextView)v.findViewById(R.id.txtNumeroSMS);vista.txtFechaSMS = (TextView)v.findViewById(R.id.txtFechaSMS);/*Se asignan a cada componente el índice de la columna a mostrar, a partir de los resultados de la consulta procesada. En cada ítem del componente de selección ListView se mostrarán el tipo, los datos y el teléfono de contacto.*/vista.txtTipoSMS.setText("Tipo de SMS: " + mensajes.get(position).getTipo() + " | ");vista.txtNumeroSMS.setText("Número: " + mensajes.get(position).getNumero() + "| ");vista.txtFechaSMS.setText("Fecha: " + mensajes.get(position).getFecha() + "| ");}else{vista = (ViewHolderMensajes) v.getTag();}return v;}
En la próxima publicación completaremos el código de este proyecto, con todos los layouts de la aplicación.
Esta entrada tiene 2 comentarios
Los comentarios están cerrados.
[…] 3.Proyecto Android con Content Providers (I) […]
[…] 3.Proyecto Android con Content Providers (I) […]