我需要一个动态的gridlayout,它可以在3乘3和4乘4之间切换。我可以将setRowCount和setColumnCount从3改为4而不是从4改为3.它将显示以下问题:
引起:java.lang.IllegalArgumentException:rowCount必须大于或等于每个子项的LayoutParams中定义的所有网格索引(和跨度)的最大值。
使用gridlayout是否有任何解决方法。
先谢谢。
答案 0 :(得分:7)
我意识到这个问题已经很老了,但是对于那些今天仍然遇到这个例外的人来说,我会提供一个解释,可以解释一下GridLayout的缩小程度是如何起作用的,以及为什么我认为它正在抛出OP的例外。
GridLayout
的子视图在缩小之后可以占用不在GridLayout
网格内的单元格,这会导致OP提到的IllegalArgumentException。为避免这种情况,请在实际调用GridLayout
或setRowCount()
之前删除将占用setColumnCount()
网格之外的单元格的子视图。这可以通过GridLayout.removeView(aboutToBeIllegalChild);
或使用GridLayout.removeAllViews();
擦除整个布局来完成。
调用GridLayout.setRowCount()
的所有内容都指定了布局应包含的新行数。但是,它不会混淆GridLayout
当前包含的子视图,也不会指定Spec
(子视图占用的列和行)。
该异常基本上告诉我们,并且文档确认,GridLayout
不允许任何子视图占用GridLayout
网格之外的单元格。例如,当网格仅为(5, 1)
时,布局将不允许子视图占用单元格4 x 1
。
这使我们了解为什么原始海报成功地动态增加了GridLayout
的尺寸,同时却没有成功减少它。放大尺寸时,如果网格动态地接收额外的行或列,则任何已附加到具有指定单元格的GridLayout
的子视图仍将放置在合法单元格中。当减少网格的尺寸时,放置在单元格中的子视图将因删除行或列而消失,现在将被视为非法。
要解决此问题,您必须事先通过调用GridLayout
从其父GridLayout.removeView(aboutToBeIllegalChild);
中删除那些(即将成为)非法子视图,或者只需通过调用{来擦除整个GridLayout
{1}}。
希望这有帮助!
答案 1 :(得分:1)
根据 Teun Kooijman 回答,您只需更改 GridLayout.LayoutParams 中的规范,并保留所有视图 GridLayout :
private void changeColumnCount(int columnCount) {
if (gridLayout.getColumnCount() != columnCount) {
final int viewsCount = gridLayout.getChildCount();
for (int i = 0; i < viewsCount; i++) {
View view = gridLayout.getChildAt(i);
//new GridLayout.LayoutParams created with Spec.UNSPECIFIED
//which are package visible
view.setLayoutParams(new GridLayout.LayoutParams());
}
gridLayout.setColumnCount(columnCount);
}
}
您还可以通过访问 GridLayout.LayoutParams.rowSpec 和 GridLayout.LayoutParams.columnSpec
以其他方式更改规范答案 2 :(得分:1)
对我来说,问题是当应用更改方向时更改GridView的列数。我通过将下面的代码放在public void onConfigurationChanged(Configuration newConfig)
中来实现它。
if (mGridLayout.getColumnCount() != getResources().getInteger(R.integer.nav_columns)) {
final int viewsCount = mGridLayout.getChildCount();
for (int i = 0; i < viewsCount; i++) {
View view = mGridLayout.getChildAt(i);
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
int colIndex = i%getResources().getInteger(R.integer.nav_columns);
int rowIndex = i/getResources().getInteger(R.integer.nav_columns);
layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
layoutParams.width = 0;
layoutParams.columnSpec = GridLayout.spec(colIndex,1,GridLayout.FILL,1f);
layoutParams.rowSpec = GridLayout.spec(rowIndex);
view.setLayoutParams(layoutParams);
}
mGridLayout.setColumnCount(getResources().getInteger(R.integer.nav_columns));
}
布局参数值可能需要根据您的需要进行更改。