Mettre le rowSpan ou le colSpan d'un enfant d'un GridLayout programmatically?
j'ai un GridLayout
avec 5 colonnes et 3 lignes. Maintenant je peux insérer les opinions arbitraires des enfants, ce qui est génial. Encore mieux est, que je peux assigner columnSpan=2
à un article pour l'étendre à 2 colonnes (la même chose avec rowSpan).
le problème est maintenant que je ne peux pas affecter rowSpan ou columnSpan de manière programmatique (c'est-à-dire à l'exécution). Quelques recherches ont suggéré quelque chose comme ceci:
layoutParams.columnSpec = GridLayout.spec(0, columnSpan);
mais je ne comprends pas très bien ce que signifient les paramètres de spec (démarrage et taille). Le la documentation est également très pauvre à ce stade.
Toute aide est très appréciée!
5 réponses
GridLayout gridLayout = (GridLayout)findViewById(R.id.tableGrid);
gridLayout.removeAllViews();
int total = 12;
int column = 5;
int row = total / column;
gridLayout.setColumnCount(column);
gridLayout.setRowCount(row + 1);
for(int i =0, c = 0, r = 0; i < total; i++, c++)
{
if(c == column)
{
c = 0;
r++;
}
ImageView oImageView = new ImageView(this);
oImageView.setImageResource(R.drawable.ic_launcher);
GridLayout.LayoutParams param =new GridLayout.LayoutParams();
param.height = LayoutParams.WRAP_CONTENT;
param.width = LayoutParams.WRAP_CONTENT;
param.rightMargin = 5;
param.topMargin = 5;
param.setGravity(Gravity.CENTER);
param.columnSpec = GridLayout.spec(c);
param.rowSpec = GridLayout.spec(r);
oImageView.setLayoutParams (param);
gridLayout.addView(oImageView);
}
Que Diriez-vous de ceci?
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
layoutParams.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getRowSpan());
layoutParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getColumnSpan());
selon la documentation, vous devriez également appeler setLayoutParams sur GridLayout si vous changez colonne ou portée de ligne après que les vues de l'enfant sont insérées dans GridLayout. Vous n'avez pas besoin de cela si vous les ajoutez en mettant span
Vous pouvez modifier L'attribut GridLayout layout_rowSpan comme ceci:
// View allocated in first row and first column
View child = findViewById(R.id.row0column0);
GridLayout.LayoutParams params =
new GridLayout.LayoutParams(child.getLayoutParams());
params.rowSpec = GridLayout.spec(0, 2); // First cell in first row use rowSpan 2.
params.columnSpec = GridLayout.spec(0, 2); // First cell in first column use columnSpan 2.
child.setLayoutParams(params);
je suis d'accord documentation besoin d'un peu d'amélioration à cet égard.
je suis l'évolution de la colonne s'étendent sur environ 2 cellule par programme et après gonfler par ce code:
GridLayout.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams();
itemLP.columnSpec = GridLayout.spec(0, 2);
gridItemV.setLayoutParams(itemLP);
l'important est de les appeler setLayoutParams
changement columnSpec
j'espère que cela aide également à vous
OK, j'ai passé quelques heures à comprendre ce qui se passe ici. Je n'ai trouvé aucun moyen de mettre columnSpan ou rowSpan à runtime.
Mais j'ai trouvé une solution qui fonctionne (au moins pour moi):
Code Java
private LinearLayout addNewSpannedView(Integer resourceId, ViewGroup rootElement) {
return (LinearLayout) ((ViewGroup) getLayoutInflater().inflate(resourceId, rootElement, true)).getChildAt(rootElement.getChildCount() - 1);
}
// set columnSpan depending on some logic (gridLayout is the layout to add the view's to -> in my case these are LinearLayouts)
shape = addNewSpannedView(columnSpan == 1 ? R.layout.grid_ll_col_span_1 : R.layout.grid_ll_col_span_2, gridLayout);
grid_ll_col_span_2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/shapeWidth"
android:layout_height="wrap_content"
android:layout_columnSpan="2"/>
Conseil: c'est très important, que vous définissiez l'attribut largeur et hauteur, avant inflate() ajoute la vue à l'élément racine (i.e. le parent élément.)
je l'espère, quelqu'un peut utiliser ce ;-)