Android: Как GridView auto_fit находит количество столбцов?

Я хотел бы лучше понять, как работает Gridview , в частности auto_fit . Вот XML-макет:

   

И он отлично работает с серией из шести эскизов (48 * 48 пикселей). В портретном режиме он отображает одну строку, шесть столбцов.

с

Я не понимаю, почему android:columnWidth="60dp" строка android:columnWidth="60dp" , так как ожидается, что auto_fit найдет нужное количество столбцов.
Без линии android:columnWidth="60dp" , он отображает сетку 3 строки и 2 столбца.

без

Вот class ImageAdapter :

 package com.examples.HelloGridView; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; public class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context c) { mContext = c; } public int getCount() { return mThumbIds.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { // if it's not recycled, initialize some attributes imageView = new ImageView(mContext); imageView.setPadding(0, 0, 0, 0); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } // references to our images private Integer[] mThumbIds = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3, R.drawable.ic_4, R.drawable.ic_5, R.drawable.ic_6 }; } 

Спасибо за помощь.

Глядя на источник GridView, ясно, что настройка отступов и высоты на вашем ImageView не поможет вам вообще. Когда ширина столбца не указана, он просто выбирает заданное количество столбцов (2):

  private void determineColumns(int availableSpace) { ... if (mRequestedNumColumns == AUTO_FIT) { if (requestedColumnWidth > 0) { // Client told us to pick the number of columns mNumColumns = (availableSpace + requestedHorizontalSpacing) / (requestedColumnWidth + requestedHorizontalSpacing); } else { // Just make up a number if we don't have enough info mNumColumns = 2; } } else { // We picked the columns mNumColumns = mRequestedNumColumns; } if (mNumColumns <= 0) { mNumColumns = 1; } ... 

Решение состоит в том, чтобы измерять размер столбца, прежде чем устанавливать ширину столбца GridView. Вот быстрый способ измерения Views offscreen:

 public int measureCellWidth( Context context, View cell ) { // We need a fake parent FrameLayout buffer = new FrameLayout( context ); android.widget.AbsListView.LayoutParams layoutParams = new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); buffer.addView( cell, layoutParams); cell.forceLayout(); cell.measure(1000, 1000); int width = cell.getMeasuredWidth(); buffer.removeAllViews(); return width; } 

И тогда вы просто установите ширину столбца GridView:

 gridView.setColumnWidth( width ); 

Согласно документации android: numColumns

auto_fit Отображает как можно больше столбцов, чтобы заполнить доступное пространство.

Поэтому, если вы вставляете ImageView с

padding установлено на zero

margin zero

layout_width установлен в wrap_content

layout_height установлен на wrap_content

В gridView должно быть максимально возможное количество детей


Имейте в виду, что ваши ImageViews могут масштабироваться (:

Это может помочь кому-то … Вам нужно найти размер ширины вручную. Основываясь на размере ширины, вы можете установить столбец

  float scalefactor = getResources().getDisplayMetrics().density * 100; int number = getWindowManager() .getDefaultDisplay().getWidth(); int columns = (int) ((float) number / scalefactor) / 2; if (columns == 0 || columns == 1) columns = 2; gridView.setNumColumns(columns); 

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

  gridview = (GridView) findViewById(R.id.gridview); SharedPreferences mySettings; mySettings = getSharedPreferences(Constants.PREFERENCES, Context.MODE_PRIVATE); int gridSize = 50 * Integer.parseInt(mySettings.getString("gridSize", "3")); gridview.setColumnWidth(gridSize + 10); 

Это все . , ,

Привет из Люцерна, Стефана

«wrap_content» работает как перенос слов для текстовых редакторов – если изображение не может вписаться в последний размер столбца, изображение переходит к следующей строке. Однако, если вы установите атрибут numcolumns на число, тогда grid может растягивать / корректировать столбцы (stretchModde – это еще одно свойство, которое вы можете использовать совместно).

ps – хотя вы отметили ответ, были бы рады узнать, помогло ли это.

  • Оверлей экрана обнаружены блоки Android-разрешения
  • Поддержка Android Repo 46.0.0 с Android Studio 2.3
  • Как разрешить ошибку «Ресурс не найден, который соответствует указанному имени» при добавлении библиотеки v7 AppCompat в Eclipse?
  • Ошибка AndroidRuntime: Посылка: не удалось вывести значение маршала
  • Не удалось найти цель с хеш-строкой 'android-25'
  • Android Studio TransformException: ошибка: выполнение не выполнено для задачи ': app: transformClassesWithDexForDebug'
  • Отображение MapView с отсутствующими fragmentами с «x» в центре
  • ИК-излучатель и Android 5.0
  • как использовать Ontouch и Onclick для ImageButton?
  • База данных с предварительным заполнением Android
  • Как найти значение в firebase Android
  • Давайте будем гением компьютера.