Línea de encabezado de TableLayout de Android

Bueno, así que tengo este TableLayout, y está lleno de datos – con todas las filas agregadas mediante programación. Tengo el TableLayout dentro de un HorizontalScrollView, que a su vez está dentro de un ScrollView – esto me da el desplazamiento horizontal y vertical. Lo que estoy tratando de hacer ahora es añadir una fila de encabezado a la misma que no se desplazará. He intentado mover cosas alrededor de modo que ambas de mis vistas de la voluta estuvieran realmente dentro del TableLayout y añadiendo los TableRows al HorizontalScrollView; Mi esperanza era poder entonces agregar la fila del jefe fuera de las vistas de la voluta.

La única otra cosa que puedo pensar es tener un segundo diseño de la tabla apenas para la fila del jefe, pero conseguir las columnas para alinear para arriba parece como sería difícil. ¿Algunas ideas?

Un enfoque consiste en incrustar un TableLayout dentro de otra fila de TableLayout y poner el encabezado en la fila anterior como se ve a continuación. Alinear los datos y el encabezado requiere que la propiedad layout_width de los objetos View de encabezado y los objetos View de los datos se establezcan en los mismos valores de saturación. Además, la propiedad layout_weight de los objetos de vista internos de TableLayout debe coincidir con su encabezado correspondiente. Ahora, en el XML a continuación, he colocado 3 TextViews en el interior TableLayout en una sola fila para que coincida con los encabezados de columna. Esto es sólo para mostrar cómo se puede hacer la alineación. Puede rellenar esos datos mediante programación inflando un diseño y agregándolo en tiempo de ejecución.

<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:text="Name" android:layout_width="100dp" android:layout_column="0" android:layout_weight="1"/> <TextView android:text="Score" android:layout_width="30dp" android:layout_column="1" android:layout_weight="1"> </TextView> <TextView android:text="Level" android:layout_width="30dp" android:layout_column="2" android:layout_weight="1"> </TextView> </TableRow> <ScrollView android:layout_height="120dp"> <TableLayout android:id="@+id/score_table" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:text="Al" android:layout_width="100dp" android:layout_column="0" android:layout_weight="1"> </TextView> <TextView android:text="1000" android:layout_width="30dp" android:layout_column="1" android:layout_weight="1"> </TextView> <TextView android:text="2" android:layout_width="30dp" android:layout_column="2" android:layout_weight="1"> </TextView> </TableRow> </TableLayout> </ScrollView> </TableLayout> 

En realidad, me ocurrió otra forma decente de hacer esto.

Basta con construir la tabla normalmente con la fila de encabezado como la primera fila, dentro de una orientación vertical LinearLayout. A continuación, quite la primera fila mediante programación y, a continuación, agregue como el primer hijo al LinearLayout. Funcionó como por arte de magia.

Editar: Esto también funciona sin tener que especificar anchuras de columnas estáticas.

Sé que la pregunta es vieja, pero fue la primera, que Google me dio como he tenido el mismo problema. Y como creo que he encontrado una mejor solución, me gustaría compartirla.

Idea: poner el TableLayout (dentro del ScrollView) en RelativeLayout y crear una superposición, que dibujaría la primera fila (encabezado) sobre todo lo demás.

Aquí está layout.xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/table_wrapper" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" tools:ignore="UselessParent" > <TableLayout android:id="@+id/table" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </ScrollView> </RelativeLayout> 

Y aquí está el código:

 TableLayout table = (TableLayout)view.findViewById(R.id.table); final TableRow headerRow = new TableRow(context); table.addView(headerRow); table.addView(new TableRow(context)); table.addView(new TableRow(context)); table.addView(new TableRow(context)); RelativeLayout tableWrapper = (RelativeLayout)view.findViewById(R.id.table_wrapper); View fakeHeaderView = new View(context) { @Override public void draw(Canvas canvas) { headerRow.draw(canvas); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = headerRow.getMeasuredWidth(); int height = headerRow.getMeasuredHeight(); widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }; tableWrapper.addView(fakeHeaderView); 

Para aquellos que no están contentos con tener que predefinir sus tamaños, encontré un poco de un hack que está trabajando para mí.

Básicamente, haga una tabla separada para el título y póngala sobre su tabla principal, pero con la misma alineación superior, cree dos copias de la fila de título y después de agregar una a la tabla principal, agregue la otra a la tabla de títulos y configure El layoutParams de la vista secundaria a la fila forman la tabla principal.

Aquí está mi ejemplo básico.

En su diseño:

 <HorizontalScrollView android:id="@+id/table_horizontal_scroll_view" android:layout_alignParentTop="true" android:layout_width="wrap_content" android:layout_height="match_parent" android:clickable="false"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <ScrollView android:layout_alignParentTop="true" android:layout_marginTop="0dp" android:id="@+id/table_vertical_scroll_view" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/grid_table_layout" /> </ScrollView> <TableLayout android:layout_alignLeft="@+id/table_vertical_scroll_view" android:layout_alignRight="@+id/table_vertical_scroll_view" android:layout_alignStart="@+id/table_vertical_scroll_view" android:layout_alignEnd="@+id/table_vertical_scroll_view" android:layout_alignParentTop="true" android:background="@color/grid_view_background" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/grid_floating_row_layout" /> </RelativeLayout> </HorizontalScrollView> 

A continuación, cuando añada sus filas:

  //clear out any views tableLayout.removeAllViews(); floatingRowLayout.removeAllViews(); TableRow[] rows = getTableContentRows() // content of your table TableRow[] titleRows = {getTitleRow(), getTitleRow()}; //two copies of your title row tableLayout.addView(titleRows[0]); // first add the first title to the main table addRows(rows) // add any other rows floatingRowLayout.addView(titleRows[1]); // floatingRowLayout is connected to id/grid_floating_row_layout titleRows[0].setVisibility(View.INVISIBLE); // make the title row added to the main table invisible // Set the layoutParams of the two title rows equal to each other. // Since this is done after the first is added to the main table, they should be the correct sizes. for(int i = 0; i < titleRows[0].getChildCount(); i++) { titleRows[1].getChildAt(i).setLayoutParams(titleRows[0].getChildAt(i).getLayoutParams()); } 
  • Diseño de tabla XML? ¿Dos filas de la misma anchura con botones de igual anchura?
  • Grilla de datos completamente funcional en Android
  • Cómo combinar fila en una celda en la disposición de la tabla en android, dinámicamente?
  • Las filas añadidas dinámicamente en tablelayout no son visibles
  • Cómo ampliar Android TableLayout
  • Agregar espacio entre columnas de un TableLayout
  • Rellene TableLayout con android: layout_weight de forma programática
  • Cursor no es visible en EditText cuando se agrega dinámicamente la vista
  • ListView o TableLayout?
  • TableRow no envuelve TextView
  • Edición de la anchura de TableLayout de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.