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?
- Android TableLayout con el ancho de la columna diferente en una fila
- Hacer células de igual anchura y altura para llenar la tabla
- ¿Cuál es el equivalente de "colspan" en un Android TableLayout?
- ¿Cómo hacer un TableLayout desplazable?
- Crear un diseño chatView en android
- Borde de elementos de la fila de tabla en android
- Disposición de respuesta de Android
- GridView o TableLayout?
- TableRow llenar el espacio restante
- Líneas de borde para celdas en GridLayout, TableLayout o GridView?
- ¿Cómo funciona android: shrinkColumns y android: stretchColumns?
- ¿Qué hace exactamente android: layout_column?
- Datos dinámicamente de datos de tabla de Android
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()); }
- ¿Por qué Bitmap a Base64 Cadena que muestra el fondo negro en webview en android?
- Detectar si la opción de accesibilidad de "Texto grande" está habilitada en Android