I have an app in AndroidStudio which loads data from a MySQL DB . To display this data, I do it through a TableLayout
. The problem is the following, I would like a specific height to be respected. When I was doing tests, it was shown with areas of fewer characters:
But when I wanted to show a new zone with more characters, the following happened:
The cell with the Brushed Southeast zone increased its height, being higher than those that follow it to its right.
This is the xml of the activity:
<LinearLayout
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/layoutTabla"
android:gravity="center">
<ScrollView
android:id="@+id/scrollvertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:layout_weight="1">
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/scrollhorizontal"
android:scrollbars="horizontal"
android:layout_weight="1">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TableLayout
android:id="@+id/tabla"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="1"
android:shrinkColumns="0">
</TableLayout>
</LinearLayout>
</HorizontalScrollView>
</ScrollView>
</LinearLayout>
</LinearLayout>
This is the Table class :
public class Tabla {
// Variables de la clase
private TableLayout tabla; // Layout donde se pintará la tabla
private ArrayList<TableRow> filas; // Array de las filas de la tabla
private Activity actividad;
private Resources rs;
private int FILAS, COLUMNAS; // Filas y columnas de nuestra tabla
/**
* Constructor de la tabla
* @param actividad Actividad donde va a estar la tabla
* @param tabla TableLayout donde se pintará la tabla
*/
public Tabla(Activity actividad, TableLayout tabla)
{
this.actividad = actividad;
this.tabla = tabla;
rs = this.actividad.getResources();
FILAS = COLUMNAS = 0;
filas = new ArrayList<TableRow>();
}
/**
* Añade la cabecera a la tabla
* @param recursocabecera Recurso (array) donde se encuentra la cabecera de la tabla
*/
public void agregarCabecera(int recursocabecera)
{
TableRow.LayoutParams layoutCelda;
TableRow fila = new TableRow(actividad);
TableRow.LayoutParams layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
fila.setLayoutParams(layoutFila);
String[] arraycabecera = rs.getStringArray(recursocabecera);
COLUMNAS = arraycabecera.length;
for(int i = 0; i < arraycabecera.length; i++)
{
TextView texto = new TextView(actividad);
layoutCelda = new TableRow.LayoutParams(obtenerAnchoPixelesTexto(arraycabecera[i]), TableRow.LayoutParams.WRAP_CONTENT);
texto.setText(arraycabecera[i]);
texto.setGravity(Gravity.CENTER_HORIZONTAL);
texto.setTextAppearance(actividad, R.style.estilo_celda);
texto.setBackgroundResource(R.drawable.tabla_celda_cabecera);
texto.setLayoutParams(layoutCelda);
fila.addView(texto);
}
tabla.addView(fila);
filas.add(fila);
FILAS++;
}
/**
* Agrega una fila a la tabla
* @param elementos Elementos de la fila
*/
public void agregarFilaTabla(ArrayList<String> elementos)
{
TableRow.LayoutParams layoutCelda;
TableRow.LayoutParams layoutFila = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);
TableRow fila = new TableRow(actividad);
fila.setLayoutParams(layoutFila);
for(int i = 0; i< elementos.size(); i++)
{
TextView texto = new TextView(actividad);
texto.setText(String.valueOf(elementos.get(i)));
texto.setGravity(Gravity.CENTER_HORIZONTAL);
texto.setTextAppearance(actividad, R.style.estilo_celda);
texto.setBackgroundResource(R.drawable.tabla_celda);
layoutCelda = new TableRow.LayoutParams(obtenerAnchoPixelesTexto(texto.getText().toString()), TableRow.LayoutParams.WRAP_CONTENT);
texto.setLayoutParams(layoutCelda);
fila.addView(texto);
}
tabla.addView(fila);
filas.add(fila);
FILAS++;
}
/**
* Elimina una fila de la tabla
* @param indicefilaeliminar Indice de la fila a eliminar
*/
public void eliminarFila(int indicefilaeliminar)
{
if( indicefilaeliminar > 0 && indicefilaeliminar < FILAS )
{
tabla.removeViewAt(indicefilaeliminar);
FILAS--;
}
}
/**
* Devuelve las filas de la tabla, la cabecera se cuenta como fila
* @return Filas totales de la tabla
*/
public int getFilas()
{
return FILAS;
}
/**
* Devuelve las columnas de la tabla
* @return Columnas totales de la tabla
*/
public int getColumnas()
{
return COLUMNAS;
}
/**
* Devuelve el número de celdas de la tabla, la cabecera se cuenta como fila
* @return Número de celdas totales de la tabla
*/
public int getCeldasTotales()
{
return FILAS * COLUMNAS;
}
/**
* Obtiene el ancho en píxeles de un texto en un String
* @param texto Texto
* @return Ancho en píxeles del texto
*/
private int obtenerAnchoPixelesTexto(String texto)
{
Paint p = new Paint();
Rect bounds = new Rect();
p.setTextSize(50);
p.getTextBounds(texto, 0, texto.length(), bounds);
return bounds.width();
}
}
And this is how I load the data:
private void listaPreciosPapa() {//método que nos trae los precios
//stringrquest para traer los datos del php
//lo ideal sería parsear el array
StringRequest stringRequest = new StringRequest(Request.Method.POST, "url",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {//try para atrapar errores si es que los hay
JSONArray jsonArray = new JSONArray(response);//creamos un array que dibuja los datos del php
for (int i = 0; i < jsonArray.length(); i++) {//ciclo para ya saben qué
JSONObject jsonObject1 = jsonArray.getJSONObject(i);//creamos un JSON objeto
//le agregamos los campos pertinentes, requisito funciona: nombre de los campos de la bd
String zona = jsonObject1.getString("nombreZona");
String premin = jsonObject1.getString("precioMinimo");
String premax = jsonObject1.getString("precioMaximo");
String prom = jsonObject1.getString("promedio");
//probando la tabla
Tabla tabla = new Tabla(ListaPreciosActivity.this, (TableLayout)findViewById(R.id.tabla));
tabla.agregarCabecera(R.array.cabecera_tabla);
ArrayList<String> elementos = new ArrayList<String>();
zona = zona.replaceAll(" ", "\n");
elementos.add(zona);
elementos.add(premax);
elementos.add(premin);
elementos.add(prom);
tabla.agregarFilaTabla(elementos);
}
} catch (JSONException e) {
e.printStackTrace();//captamos el error
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});//same bug, different error
RequestQueue requestQueue = Volley.newRequestQueue(ListaPreciosActivity.this); //esto ya fue explicado
requestQueue.add(stringRequest);
}
Can someone tell me how I can keep it high?
Try adjusting the height parameter when you use it in the addTableRow
TableRow.LayoutParams()
method (since that's where you enter the width and height), give it a fixed size.Modification example:
An alternative solution could also be using setShrinkAllColumns(boolean) which in this case would help you see the shrinkable columns.
Here you can see examples of the mentioned method, the change in this case would be when you define your table:
I hope it works for you. Cheers ;)