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 – хотя вы отметили ответ, были бы рады узнать, помогло ли это.

  • Чтение APN в Android 4.2?
  • Android - установить ProgressBar как вертикальную полосу вместо горизонтальной?
  • Передача растрового изображения между двумя действиями
  • Приложение неправильно сконфигурировано для входа в Facebook с помощью ключа ключа Хэш
  • Android: рекомендации AsyncTask: частный class или открытый class?
  • Как увеличить размер текущего сфокусированного объекта на RecyclerView?
  • android.view.InflateException: двоичный файл XML: ошибка раздувания fragmentа classа
  • Получить текущий видимый текст в текстовом виде
  • Как установить Android apk из кода в единстве
  • Android Emulator vs Real Device
  • Высота Gridview снижается
  • Давайте будем гением компьютера.