Установите фиксированную высоту строки GridView

У меня возникают проблемы со строками в GridView.

Я хотел бы установить размер элементов (высота / ширина) в XML, а затем просто автофит GridView, как многие из них, как он может без растягивания. Если он не может соответствовать следующему элементу, он должен просто добавить отступы вокруг текущего количества элементов, которые он мог поместить.

В настоящее время я получаю 2 столбца (которые для меня почти кажутся фиксированным размером), и строки растягиваются. Может кто-то, пожалуйста, помогите объяснить, что происходит и как добиться того, чего я хочу?

Вид сетки:

<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/main_grid" android:numColumns="auto_fit" android:gravity="center" android:paddingRight="20dp" android:paddingLeft="20dp" android:clipToPadding="true" android:fitsSystemWindows="true" android:stretchMode="none" android:background="@drawable/main_grid_background"> </GridView> 

GridItem (я хочу его 320×320, поскольку позже я вставляю в него фоновое изображение, которое выглядит странно, если это не идеальный квадрат).

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="320dp" android:layout_height="320dp" android:padding="10dp" > <TextView android:id="@+id/grid_item_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="@+id/label" android:layout_marginTop="5dp" android:textColor="@color/black" android:textSize="15sp" android:visibility="invisible" android:layout_centerInParent="true" > </TextView> </RelativeLayout> 

Ява:

 public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridView; if (convertView == null) { gridView = new View(context); // get layout from mobile.xml gridView = inflater.inflate(R.layout.main_grid_item, null); } else { gridView = (View) convertView; } TextView textView = (TextView) gridView .findViewById(R.id.grid_item_label); //SET TEXT AND BACKGROUND IMAGE HERE //gridView.setBackgroundResource(R.drawable.main_grid_item_import); return gridView; } 

Solutions Collecting From Web of "Установите фиксированную высоту строки GridView"

В CustomAdapter

 v.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, rowHigh)); 

RowHigh – это измерение, которое вы должны изменить

 public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightSpec; if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) { // The great Android "hackatlon", the love, the magic. // The two leftmost bits in the height measure spec have // a special meaning, hence we can't use them to describe height. heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST); } else { heightSpec = heightMeasureSpec; } super.onMeasure(widthMeasureSpec, heightSpec); } } 

В XML:

 <MyGridView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/main_grid" android:gravity="center"/> 

Итак, это не идеальный ответ, но так я и получил его на работу. Идеи, заимствованные из этой темы.

Все это работает, предполагая, что я знаю размеры моего изображения, которые составляют 320×320. Кроме того, в GridView мне пришлось установить android:columnWidth="320dp" иначе это не сработало. Если у кого-то есть лучшая идея, отправьте его … пока я продолжаю.

Элемент сетки XML:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" > <ImageView android:id="@+id/grid_item_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"/> <TextView android:id="@+id/grid_item_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="@+id/label" android:textColor="@color/black" android:layout_alignLeft="@+id/grid_item_image" android:layout_alignTop="@+id/grid_item_image" android:layout_alignRight="@+id/grid_item_image" android:layout_alignBottom="@+id/grid_item_image" android:gravity="center" android:textSize="15sp" android:visibility="invisible"> </TextView> </RelativeLayout> 

GridView XML:

 <GridView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/main_grid" android:numColumns="auto_fit" android:gravity="center" android:columnWidth="320dp" android:paddingRight="20dp" android:paddingLeft="20dp" android:clipToPadding="true" android:fitsSystemWindows="true" android:stretchMode="columnWidth" android:background="@drawable/main_grid_background"> </GridView>