Подтвердить что ты не робот

Устанавливать rowSpan или colSpan дочернего элемента GridLayout программно?

У меня есть GridLayout с 5 столбцами и 3 строками. Теперь я могу вставить произвольные дочерние представления, что здорово. Еще лучше, что я могу назначить columnSpan=2 для некоторого элемента, чтобы охватить его до 2 столбцов (то же самое с rowSpan).

Теперь проблема заключается в том, что я не могу программно программировать rowSpan или columnSpan (то есть во время выполнения). Некоторые поиски предложили что-то вроде этого:

layoutParams.columnSpec = GridLayout.spec(0, columnSpan);

Но я не совсем понимаю, что означают параметры spec (начало и размер). На данный момент документация также довольно плохая.

Любая помощь очень ценится!

4b9b3361

Ответ 1

ОК, я провел несколько часов, выясняя, что происходит здесь. Ну, я не нашел никакого рабочего способа установить columnSpan или rowSpan во время выполнения.

Но я нашел решение, которое работает (по крайней мере для меня):

Код 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 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"/>

Подсказка: очень важно, чтобы вы установили атрибут width и height, до inflate() добавляет представление в корневой элемент (т.е. родительский элемент).

Надеюсь, кто-то может это использовать, -)

Ответ 2

    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

Ответ 3

Как насчет этого?

GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
layoutParams.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getRowSpan());
layoutParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getColumnSpan());

В соответствии с документацией вы также должны вызвать setLayoutParams в GridLayout, если вы меняете ширину столбца или строки ПОСЛЕ того, как дочерние представления вставляются в GridLayout. Это вам не нужно, если вы добавляете их при установке диапазона

Ответ 4

Вы можете изменить атрибут layout_rowSpan GridLayout следующим образом:

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

Согласен, документация нуждается в небольшом улучшении в этом отношении.

Ответ 5

Я изменяю диапазон столбцов примерно на 2 ячейки программно и после раздувается этим кодом:

GridLayout.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams();
itemLP.columnSpec = GridLayout.spec(0, 2);
gridItemV.setLayoutParams(itemLP);

Важным является вызов setLayoutParams после изменения columnSpec Я надеюсь, что это поможет и вам.