Android Gridlayout: добавляйте новые представления всегда на максимальной отметке

Я пытаюсь использовать GridLayout (не GridView!), чтобы получить такой макет:

введите здесь описание изображения

Но с моим кодом (и всем, что я пробовал до сих пор) верхняя часть двух горизонтально соседних представлений всегда выравнивается. Можно ли вместо этого указать, что каждое новое представление должно быть выровнено по верхней отметке его столбца? (см. Новые виджеты макета: Space и GridLayout в разделе «Автоматическое размещение индекса»)

Мой layout.xml сейчас выглядит так:

<GridLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/scroll_view_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:columnCount="2"
        />

К этому GridLayout я добавляю свои представления программно:

GridLayout scrollViewContainer = Views.findById(rootView, R.id.scroll_view_container);

for (i=0; i < list.size(); i++) 
  TextView tv = new TextView(context);
  tv.setText("foobar");

  GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
  // left, right, left, right - creates new default rows
  lp.columnSpec = GridLayout.spec(i%2);

  // this would put every view in the same row => all Views are on the very top
  // lp.rowSpec = GridLayout.spec(0);

  tv.setLayoutParams(lp);

  scrollViewContainer.addView(tv);

}

person muetzenflo    schedule 29.08.2013    source источник


Ответы (2)


Мой код был похож на ваш, и я столкнулся с той же проблемой. Проблема заключается в установке спецификаций столбцов и строк непосредственно в layoutParams после их создания. Вы должны указать эти атрибуты в конструкторе.

Spec rowspecs = GridLayout.spec(row, 1); 
Spec colspecs = GridLayout.spec(column, 1);
GridLayout.LayoutParams gridLayoutParam = new GridLayout.LayoutParams(rowspecs, colspecs);
person HiggGuayo    schedule 28.10.2013
comment
Что такое строка и что такое столбец? Что это за объекты? - person IgorGanapolsky; 04.01.2014

ОБНОВЛЕНИЕ:

Использование нового RecyclerView и StaggeredGridViewLayoutManager теперь вы можете добиться этого без сторонних библиотек.

СТАРЫЙ ОТВЕТ:

Я узнал, что этот вид View уже был создан Google под названием StaggeredGridView. Когда-то она была в AOSP, но снова была удалена (источник этой информации я потерял... но тем не менее). Но вы можете найти модифицированную версию StaggeredGridView здесь:

https://github.com/maurycyw

Оригинальный источник Google находится здесь:

https://github.com/friberry/StaggeredGridView/blob/9c4582ab8e79294ab60f63277e2a54c58e74b372/src/com/origamilabs/library/views/StaggeredGridView.java

И еще одна очень хорошая его реализация находится в официальном приложении Etsy. Код был обнародован:

https://github.com/etsy/AndroidStaggeredGrid

person muetzenflo    schedule 08.09.2013