Al igual que pasa en todos los elementos que muestran datos (listas, recycler, grid, etc…) los datos se pueden asociar mediante un adaptador simple o bien mediante un adaptador personalizado que utilice un XML creado por el usuario. En el caso de los datos que vienen de SQLite ocurre lo mismo para lo cual se utiliza una clase abstracta llamada CursorAdapter
Asociar datos a un CursorAdapter
Para poder personalizar el aspecto de una lista con datos ploblada desde SQLite hay que crear una clase que extienda de CursosAdapter. Debido a que se trata de una clase con métodos no escritos se obliga a ello, además de un constructor al cual se le pasa contexto, objeto cursos y flags:
public class AdaptadorCursor extends CursorAdapter { public AdaptadorCursor(Context context, Cursor c) { super(context, c, 0); } @Override public View newView(Context context, Cursor cursor, ViewGroup viewGroup) { return null; } @Override public void bindView(View view, Context context, Cursor cursor) { } }
La funcionalidad de los métodos es la siguiente:
- newView: se utiliza para poder inflar la vista donde se colocarán los elementos de la lista. En este punto es donde se necesita un XML con el aspecto deseado
- bindView: se utiliza para asociar en las vistas del XML los datos que vienen del objeto cursor. Para ello se utilizan los parámetros que trae el método
public class AdaptadorCursor extends CursorAdapter { public AdaptadorCursor(Context context, Cursor c) { super(context, c, 0); } @Override public View newView(Context context, Cursor cursor, ViewGroup viewGroup) { return LayoutInflater.from(context).inflate(R.layout.item_layout, viewGroup,false); } @Override public void bindView(View view, Context context, Cursor cursor) { TextView nombre, apellido, direccion, telefono; nombre = view.findViewById(R.id.text_nombre_item); apellido = view.findViewById(R.id.text_apellido_item); direccion = view.findViewById(R.id.text_direccion_item); telefono = view.findViewById(R.id.text_telefono_item); nombre.setText(cursor.getString(cursor.getColumnIndex(EsquemaUsuario.EntradaUsuario.NOMBRE))); apellido.setText(cursor.getString(cursor.getColumnIndex(EsquemaUsuario.EntradaUsuario.APELLIDO))); direccion.setText(cursor.getString(cursor.getColumnIndex(EsquemaUsuario.EntradaUsuario.DIRECCION))); telefono.setText(String.valueOf(cursor.getInt(cursor.getColumnIndex(EsquemaUsuario.EntradaUsuario.TELEFONO)))); } }
Asociar adaptador a ListView
Una vez creado el adaptador tan solo queda asociarlo a la vista correspondiente. Para ello se realiza la misma operación que con los adaptadores normales utilizando el método setAdapter.
SQLiteDatabase dbUsuariosLectura = usuarioOpenHelper.getReadableDatabase(); Cursor c = dbUsuariosLectura.query(EsquemaUsuario.EntradaUsuario.NOMBRE_TABLA, null, null, null, null, null, null); AdaptadorCursor adaptador = new AdaptadorCursor(this,c); lista.setAdapter(adaptador); dbUsuariosLectura.close();
Manejar eventos
Para poder manejar eventos se puede hacer directamente sobre el elemento listView o dentro del adaptador utilizando una interfaz de callBack tal y como se explicó en entradas anteriores