减少android中gridlayout的行/列数

时间:2014-10-22 18:36:30

标签: android android-gridlayout

我需要一个动态的gridlayout,它可以在3乘3和4乘4之间切换。我可以将setRowCount和setColumnCount从3改为4而不是从4改为3.它将显示以下问题:

引起:java.lang.IllegalArgumentException:rowCount必须大于或等于每个子项的LayoutParams中定义的所有网格索引(和跨度)的最大值。

使用gridlayout是否有任何解决方法。

先谢谢。

3 个答案:

答案 0 :(得分:7)

我意识到这个问题已经很老了,但是对于那些今天仍然遇到这个例外的人来说,我会提供一个解释,可以解释一下GridLayout的缩小程度是如何起作用的,以及为什么我认为它正在抛出OP的例外。

简而言之:

GridLayout的子视图在缩小之后可以占用不在GridLayout网格内的单元格,这会导致OP提到的IllegalArgumentException。为避免这种情况,请在实际调用GridLayoutsetRowCount()之前删除将占用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));
    }

布局参数值可能需要根据您的需要进行更改。