Установить rowSpan или colSpan ребенка GridLayout программно?
у меня есть GridLayout
С 5 столбцами и 3 строками. Теперь я могу вставлять произвольные дочерние представления, что здорово. Еще лучше то, что я могу назначить columnSpan=2
к некоторому элементу, чтобы охватить его до 2 столбцов (то же самое с rowSpan).
проблема в том, что я не могу назначить rowSpan или columnSpan программно (т. е. во время выполнения). Какой-то поиск предложил что-то вроде этого:
layoutParams.columnSpec = GridLayout.spec(0, columnSpan);
но я не совсем понимаю, что означают параметры спецификации (начало и размер). Этот документация на данный момент также является довольно плохой.
любая помощь будет высоко ценится!
5 ответов
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. Вам это не нужно, если вы добавляете их при настройке span
можно изменить 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);
Я согласен, что документация нуждается в небольшом улучшении в этом отношении.
Я изменяю диапазон столбцов около 2 ячеек программно и после надуть этим кодом:
GridLayout.LayoutParams itemLP = (GridLayout.LayoutParams)gridItemV.getLayoutParams();
itemLP.columnSpec = GridLayout.spec(0, 2);
gridItemV.setLayoutParams(itemLP);
важным является вызов setLayoutParams
после смены columnSpec
надеюсь, это поможет и вам
хорошо, я потратил несколько часов, выясняя, что здесь происходит. Ну, я не нашел никакого рабочего способа установить 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 () добавляет представление к корневому элементу (т. е. родительскому элемент.)
Я надеюсь, кто-то может использовать это ;-)