Tutorial CRUD Android + SQLite (II): Mostrar datos en ListView

Posted by in Programación Android

Siguiendo con el Tutorial Android + SQLite en la entrada anterior vimos la definición y creación de la base de datos SQLite para la aplicación CRUD de ejemplo que consistía en registrar las condiciones ofrecidas por las entidades bancarias para la solicitud de una hipoteca. En la entrada actual trataremos la visualización de los registros de la base de datos SQLite en un componente ListView.
 

1: HipotecaDbAdapter

Definimos la clase HipotecaDbAdapter para gestionar las operaciones de la entidad HIPOTECA en la base de datos SQLite.
android_sqlite_listview_1

package com.sodenet.hipotecas;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class HipotecaDbAdapter {

	/**
	 * Definimos constante con el nombre de la tabla
	 */
	public static final String C_TABLA = "HIPOTECA" ;

	/**
	 * Definimos constantes con el nombre de las columnas de la tabla
	 */
	public static final String C_COLUMNA_ID	= "_id";
	public static final String C_COLUMNA_NOMBRE = "hip_nombre";
	public static final String C_COLUMNA_CONDICIONES = "hip_condiciones";
	public static final String C_COLUMNA_CONTACTO = "hip_contacto";
	public static final String C_COLUMNA_EMAIL = "hip_email";
	public static final String C_COLUMNA_TELEFONO = "hip_telefono";
	public static final String C_COLUMNA_OBSERVACIONES = "hip_observaciones";

	private Context contexto;
	private HipotecaDbHelper dbHelper;
	private SQLiteDatabase db;

	/**
	 * Definimos lista de columnas de la tabla para utilizarla en las consultas a la base de datos
	 */
	private String[] columnas = new String[]{ C_COLUMNA_ID, C_COLUMNA_NOMBRE, C_COLUMNA_CONDICIONES, C_COLUMNA_CONTACTO, C_COLUMNA_EMAIL, C_COLUMNA_TELEFONO, C_COLUMNA_OBSERVACIONES} ;

	public HipotecaDbAdapter(Context context)
	{
		this.contexto = context;
	}

	public HipotecaDbAdapter abrir() throws SQLException
	{
		dbHelper = new HipotecaDbHelper(contexto);
		db = dbHelper.getWritableDatabase();
		return this;
	}

	public void cerrar()
	{
		dbHelper.close();
	}

	/**
	 * Devuelve cursor con todos las columnas de la tabla
	 */
	public Cursor getCursor() throws SQLException
	{
		Cursor c = db.query( true, C_TABLA, columnas, null, null, null, null, null, null);

		return c;
	}
}

 

2: HipotecaCursorAdapter

Definimos la clase HipotecaCursorAdapter que utilizaremos desde la Activity Hipoteca para alimentar el ListView con los datos obtenidos a traves de la clase HipotecaDbAdapter.
android_sqlite_listview_2

package com.sodenet.hipotecas;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class HipotecaCursorAdapter extends CursorAdapter
{

	private HipotecaDbAdapter dbAdapter = null ;

	public HipotecaCursorAdapter(Context context, Cursor c)
	{
		super(context, c);
		dbAdapter = new HipotecaDbAdapter(context);
		dbAdapter.abrir();
	}

	@Override
	public void bindView(View view, Context context, Cursor cursor)
	{
		TextView tv = (TextView) view ;

		tv.setText(cursor.getString(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_NOMBRE)));
	}

	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent)
	{
		final LayoutInflater inflater = LayoutInflater.from(context);
		final View view = inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);

		return view;
	}
}

 

3: Diseño Layout Activity Principal

En la entrada anterior creamos la Activity Hipoteca dejando el diseño de la misma en blanco. Ahora vamos a editar el layout de esta Activity posicionando un ListView que utilizaremos para mostrar los registros de la base de datos SQLite.

android_sqlite_listview_3

Editamos archivo res/layout/activity_hipoteca.xml dejándolo como sigue a continuación:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Hipoteca" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/lista_vacia" />
    
</LinearLayout>

Añadimos al archivo res/values/strings.xml la definición de string que utilizamos cuando la lista está vacía.

<string name="lista_vacia">Sin Datos</string>

 

4: Enlazar ListActivity con la base de datos SQLite

Modificamos la Activity principal de la aplicación para que herede de ListActivity, ya que simplificará el tratamiento de la lista en próximas modificaciones.
En el método onCreate obtenemos la referencia a la ListView incluida en el layout y creamos y preparamos el adaptador dbAdapter para gestionar las operaciones sobre la entidad HIPOTECA en la base de datos SQLite.
El método consultar() se encargará de vincular el CursorAdapter hipotecaAdapter a la ListView lista.

package com.sodenet.hipotecas;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;

public class Hipoteca extends ListActivity {

	private HipotecaDbAdapter dbAdapter;
    private Cursor cursor;
    private HipotecaCursorAdapter hipotecaAdapter ;
    private ListView lista;

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

		lista = (ListView) findViewById(android.R.id.list);

		dbAdapter = new HipotecaDbAdapter(this);
		dbAdapter.abrir();

		consultar();
	}

	private void consultar()
	{
		cursor = dbAdapter.getCursor();
		startManagingCursor(cursor);
		hipotecaAdapter = new HipotecaCursorAdapter(this, cursor);
		lista.setAdapter(hipotecaAdapter);
	}

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

 

5: Ejecución de la aplicación

¡Ya está todo listo! Ahora basta con ejecutar la aplicación en el emulador.

android_sqlite_listview_4


 
Si tienes alguna pregunta o algo que aportar no lo dudes … ¡tienes los comentarios a tu disposición!