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!

29
demandé sur msrd0 2012-11-23 19:38:06

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);
    }

 have look on this image - you can change number of rows and column as you need

45
répondu Nikhil Pingle 2013-11-08 08:04:40

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

14
répondu chpasha 2013-04-15 14:24:07

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.

8
répondu Sid Morad 2014-05-09 10:55:37

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

4
répondu m1uan 2013-08-12 00:16:25

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 ;-)

3
répondu The_Unknown 2012-11-23 23:40:59