Android: ¿Cómo encuentra GridView auto_fit la cantidad de columnas?

Me gustaría entender mejor cómo funciona Gridview , en particular auto_fit . Aquí está el diseño XML:

   

Y funciona bien con una serie de seis miniaturas (48 * 48 píxeles). En modo retrato, muestra una fila, seis columnas.

con

Lo que no entiendo es por qué la línea android:columnWidth="60dp" es necesaria, porque se espera que auto_fit encuentre el número correcto de columnas.
Sin la línea de android:columnWidth="60dp" , muestra una cuadrícula de 3 filas y 2 columnas.

sin

Aquí está la clase 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 }; } 

Gracias por tu ayuda.

Al observar la fuente de GridView, está claro que configurar el relleno y la altura en su ImageView no lo ayudará en absoluto. Cuando no se especifica un ancho de columna, simplemente elige un número preestablecido de columnas (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; } ... 

La solución es medir el tamaño de su columna antes de establecer el ancho de la columna de GridView. Aquí hay una manera rápida de medir vistas fuera de pantalla:

 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; } 

Y luego simplemente estableces el ancho de la columna de GridView:

 gridView.setColumnWidth( width ); 

De acuerdo con la documentación de android: numColumns

auto_fit Muestra tantas columnas como sea posible para llenar el espacio disponible.

Entonces, si inserta ImageView con

padding ajustado a zero

margin puesto a zero

layout_width establecido en wrap_content

layout_height establecido en wrap_content

El gridView debe contener la mayor cantidad posible de niños


Tenga en cuenta que sus ImageViews pueden estar escalando (:

Esto puede ayudar a alguien … Necesita encontrar el tamaño de ancho manualmente. En función del tamaño del ancho, puede configurar la columna

  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); 

Encuentro que generalmente sé cuánto quiero que sean mis columnas. O sé el tamaño de mis imágenes o dejo que el usuario determine ese tamaño. Por lo tanto, puedo establecer el ancho en mi Actividad:

  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); 

Eso es todo . . .

Saludos desde Lucerna, Stephan

“wrap_content” funciona como el ajuste de texto para los editores de texto: si la imagen no cabe en el último tamaño de columna, la imagen fluye a la siguiente fila. Sin embargo, si configura el atributo numcolumns en un número, entonces la cuadrícula puede estirar / ajustar las columnas (stretchModde es otra propiedad que puede usar en conjunto).

ps: aunque hayas marcado la respuesta, te agradaría saber si esto ayudó.