以编程方式设置GridLayout子项的rowSpan或colSpan?

The*_*own 30 html android html-table grid-layout columnspan

我有GridLayout5列3行.现在我可以插入任意子视图,这很棒.更好的是,我可以分配columnSpan=2给某个项目以便将其扩展到2列(与rowSpan相同).

现在的问题是,我不能以编程方式(即在运行时)分配rowSpan或columnSpan.一些搜索建议这样的事情:

layoutParams.columnSpec = GridLayout.spec(0, columnSpan);
Run Code Online (Sandbox Code Playgroud)

但我不太清楚spec的参数是什么意思(开始和大小).此时的文档也很差.

任何帮助都非常感谢!

Nik*_*gle 46

    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);
    }
Run Code Online (Sandbox Code Playgroud)

 查看此图像 - 您可以根据需要更改行数和列数

  • 问题是关于以编程方式设置跨度。但最重要的答案是简单地向网格布局添加视图......太有趣了 (3认同)

小智 14

这个怎么样?

GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
layoutParams.rowSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getRowSpan());
layoutParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, item.getColumnSpan());
Run Code Online (Sandbox Code Playgroud)

根据文档,如果在将子视图插入GridLayout之后更改列或行跨度,则还应在GridLayout上调用setLayoutParams.如果在设置范围时添加它们,则不需要此项

  • 这是正确的答案.GridLayout.spec(start,size)的参数实际上分别设置了行(或列)和跨度(因此可能应该是GridLayout.spec(rowOrColumn,span)).可怕的糟糕文档. (6认同)

Sid*_*rad 9

您可以像这样修改GridLayout layout_rowSpan属性:

// 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);
Run Code Online (Sandbox Code Playgroud)

我同意文档在这方面需要一点点改进.


m1u*_*uan 5

我正在以编程方式更改大约 2 个单元格的列跨度,并通过此代码充气

GridLayout.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams();
itemLP.columnSpec = GridLayout.spec(0, 2);
gridItemV.setLayoutParams(itemLP);
Run Code Online (Sandbox Code Playgroud)

重要的是setLayoutParams更改后调用columnSpec 我希望它也对您有所帮助


The*_*own 4

好吧,我花了几个小时弄清楚这里发生了什么。好吧,我没有找到任何在运行时设置 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'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);
Run Code Online (Sandbox Code Playgroud)

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"/>
Run Code Online (Sandbox Code Playgroud)

提示:非常重要的是,在inflate() 将视图添加到根元素(即父元素)之前设置宽度和高度属性。

我希望有人可以使用这个;-)