Intereting Posts

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

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

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

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

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

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

Bye The_Unknown

Solutions Collecting From Web of "Устанавливать rowSpan или colSpan дочернего элемента GridLayout программно?"

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

Посмотрите на это изображение - вы можете изменить количество строк и столбцов, сколько вам нужно

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

 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. Это вам не нужно, если вы добавляете их при настройке диапазона

Вы можете изменить атрибут 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); 

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

Хорошо, я провел несколько часов, выясняя, что здесь происходит. Ну, я не нашел никакого рабочего способа установить 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); 

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.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams(); itemLP.columnSpec = GridLayout.spec(0, 2); gridItemV.setLayoutParams(itemLP); 

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