Crear una tabla dinámica, por código en vez de usar XML

A veces necesitas crear una tabla de forma dinámica, por código. Por ejemplo, si quieres mostrar resultados de una base de datos en una pantalla con ScrollView, no deberías hacerlo mediante ListView ni mediante GridView porque incorporan sus propios controles de scroll, lo que interfiere con los de ScrollView. La solución más práctica es poner una tabla. Pero si lo que muestra la tabla procede de una base de datos, a priori no sabes cuántas filas debes poner, con lo que no puedes usar XML sino código. No se si me explico.

Crear una tabla por código es bastante fácil. En primer lugar tienes que crear una tabla vacía en XML. Vacía, sin fila alguna.

<TableLayout
            android:id="@+id/tablacultivos"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:stretchColumns="2"
            android:shrinkColumns="2" >
</TableLayout>
Vale, ahora nos vamos al código. Vamos a crear una tabla con 3 columnas y n filas. Primero enlazamos con la tabla y creamos unas cuantos patrones Layout básicos: para la fila y para cada una de las columnas.
TextView txtCultivos=(TextView) getView().findViewById(R.id.LblCultivos);
TableLayout tabladatos=(TableLayout) getView().findViewById(R.id.tablacultivos);
TableRow.LayoutParams layoutFila=new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableRow.LayoutParams layoutFecha=new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableRow.LayoutParams layoutMuestra=new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableRow.LayoutParams layoutResultado=new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
Como ves, vamos a poner las tres columnas y la fila todas iguales: con anchura WRAP_CONTENT y altura WRAP_CONTENT;
Ahora creamos variables para la fila y las columnas.
TableRow fila;
TextView txtFecha;
TextView txtMuestra;
TextView txtResultado;
Es conveniente que reseteemos la tabla a cero. En mi experiencia, si entras en una tabla dinámica todo bien. Pero si sales y vuelves a entrar, las filas se añaden otra vez con lo que aparecen duplicadas. Para evitarlo, empieza reseteando la tabla.
tabladatos.removeAllViews();
Ahora tienes que consultar tu base de datos y obtener un cursor. Eso es material para unos cuantos temas aparte y no te lo voy a explicar aquí. Si no sabes cómo consultar SQLite ni lo que es un cursor, nada de todo esto tiene sentido. Así que vete a tu base de datos, consúltala y obtén un listado en forma de Cursor. ¿Vale?.
De acuerdo, ya tienes un Cursor. Ahora vamos a recorrerlo y al tiempo vamos creando la tabla añadiendo una fila nueva en cada pasada. Observa que para añadir la fila hay que crear los TextView, puedes alterar luego sus propiedades con setGravity, setPadding, etc. También tienes que añadir los parámetros que creaste al principio. Y por último, añades los TextView al layout de fila. Y para terminar añades el layout de Fila a la tabla. Esto se repetirá una vez por pasada a medida que avanzamos por el cursor. Pongo sólo el código relevante.
No me digas que no es fácil.
if (cursor.moveToFirst()) {
         do {
               fila=new TableRow(this); // Si, necesita contexto
               fila.setLayoutParams(layoutFila);

               txtFecha=new TextView(this);
               txtMuestra=new TextView(this);
               txtResultado=new TextView(this);

               txtFecha.setText(cursor.getString(0));
               txtFecha.setGravity(Gravity.RIGHT);
               txtFecha.setPadding(0, 0, 5, 0);
               txtFecha.setLayoutParams(layoutFecha);

               txtMuestra.setText(cursor.getString(1));
               txtMuestra.setPadding(0,0,5,0);
               txtMuestra.setLayoutParams(layoutMuestra);

               txtResultado.setText(cursor.getString(2));
               txtResultado.setLayoutParams(layoutMuestra);
               fila.addView(txtFecha);

               fila.addView(txtMuestra);
               fila.addView(txtResultado);

               tabladatos.addView(fila);
         } while (cursor.moveToNext());
}
Be Sociable, Share!

Puedes seguir cualquier respuesta a esta entrada mediante el canal RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio.

Deja un comentario

Disculpa, debes iniciar sesión para escribir un comentario.