Applications TableLayout Rubrique rangée
-
18-09-2019 - |
Question
Ok, donc j'ai ce TableLayout, et son plein de données - avec toutes les lignes ajoutées par programme. J'ai la TableLayout à l'intérieur d'un HorizontalScrollView, qui est à son tour dans un ScrollView - cela me donne le défilement à la fois horizontalement et verticalement. Ce que je suis en train de faire maintenant est d'ajouter une ligne d'en-tête pour ce qui ne défile pas. Je l'ai essayé de déplacer les choses afin que mes deux vues de défilement étaient en fait à l'intérieur de la TableLayout et en ajoutant les tablerows au HorizontalScrollView; mon espoir était de pouvoir ajouter ensuite la ligne d'en-tête en dehors des vues de défilement.
La seule autre chose que je peux penser est d'avoir une deuxième mise en page de table juste pour la ligne d'en-tête, mais obtenir les colonnes à aligner semble que ce serait difficile. Toutes les idées?
La solution
Une approche consiste en l'incorporation d'un TableLayout à l'intérieur de la rangée d'un autre TableLayout et en mettant l'en-tête dans la rangée précédente comme on le voit ci-dessous. Alignement des données et l'en-tête nécessite la propriété layout_width des objets Voir d'en-tête et les objets de vue des données à régler sur les mêmes valeurs d'immersion. En outre, la propriété de layout_weight les objets View TableLayout intérieure doit correspondre à son en-tête correspondant. Maintenant, dans le code XML ci-dessous, je l'ai placé 3 TextViews dans la TableLayout intérieure en une seule rangée pour correspondre avec les en-têtes de colonnes. Ceci est juste pour montrer comment l'alignement peut être fait. Vous pouvez remplir ces données par programme en gonflant une mise en page et en l'ajoutant à l'exécution.
<?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>
Autres conseils
En fait, je suis venu avec une autre façon décente de le faire.
Il suffit de construire la table normalement avec la ligne d'en-tête en tant que première rangée, à l'intérieur d'une orientation verticale LinearLayout. Ensuite, supprimez la programmation première ligne puis l'ajouter comme premier enfant au LinearLayout. Cela a fonctionné comme un charme.
Edit: Cela fonctionne également sans avoir à spécifier la largeur des colonnes statiques
.Je sais que la question est vieux, mais il était le premier, que Google m'a donné comme je l'ai eu le même problème. Et comme je pense que je l'ai trouvé une meilleure solution, je voudrais partager.
Idée:. Mettre le TableLayout (à l'intérieur du ScrollView) dans RelativeLayout et de créer une superposition, qui attirerait la première ligne (en-tête) sur tout le reste
Voici 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>
Et voici le code:
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);
Pour ceux qui ne satisfait avoir à prédéfinir vos tailles, je trouve un peu un hack qui travaille pour moi.
En gros, faire une table distincte pour le titre et le mettre sur votre table principale, mais avec le même alignement supérieur, puis créer deux copies de la ligne de titre et après avoir ajouté un à la table principale, ajoutez l'autre au titre table et définir les layoutParams de la vue de l'enfant à la ligne forment la table principale.
Voici mon exemple de base.
dans votre mise en page:
<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>
Ensuite, lorsque vous ajoutez vos lignes:
//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());
}
Utiliser deux TableLayout un dans ScrollView comme donner android:stretchColumns="*"
<RelativeLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:paddingTop="5dp"
android:layout_height="match_parent"
android:layout_below="@+id/llSpinner">
<TableLayout
android:layout_width="match_parent"
android:id="@+id/tableHead"
android:stretchColumns="*"
android:layout_height="wrap_content">
</TableLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/tableTotal"
android:layout_below="@+id/tableHead"
android:id="@+id/scrolltable">
</ScrollView>
<TableLayout
android:layout_width="match_parent"
android:id="@+id/tableTotal"
android:stretchColumns="*"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content">
</TableLayout>
</RelativeLayout>
puis créer une vision commune pour les lignes et mention plus important android:layout_width="0dp"
<TableRow
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:focusable="true"
android:focusableInTouchMode="false"
android:clickable="true"
android:background="@android:drawable/list_selector_background">
<TextView
android:text="S.No"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/tbsNo"
android:layout_weight="1"
android:gravity="center"
android:layout_column="1" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Date"
android:layout_weight="1"
android:gravity="center"
android:id="@+id/tbDate"
android:layout_column="2" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Count"
android:layout_weight="1"
android:gravity="center"
android:id="@+id/tbMrCount"
android:layout_column="3" />
</TableRow>
dans l'activité
Tablelayout tableHeading =(TableLayout)findViewById(R.id.tableHead);
Tablelayout table =(TableLayout) findViewById(R.id.table_repots);
trHeading = (TableRow) getLayoutInflater().inflate(R.layout.table_row_item, null);
trHeading.setBackgroundColor(Color.parseColor("#6688AC"));
trHeading.setPadding(0,10,0,10);
TextView tv;
tv = (TextView) trHeading.findViewById(R.id.tbsNo);
tv.setText("S.No");
tv = (TextView) trHeading.findViewById(R.id.tbDate);
tv.setText("Date");
table.addView(tv);