Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: ¿Cómo GridView auto_fit encuentra el número de columnas?

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

 <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:columnWidth="60dp" android:numColumns="auto_fit" /> 

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 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.

  • GridView VS GridLayout en Aplicaciones de Android
  • Cómo establecer el elemento de vista de cuadrícula según lo seleccionado
  • Android - Gridview con Custom BaseAdapter, crear onclicklistener
  • Agregar vistas entre elementos en GridView
  • Utilizar ListView o GridView dinámicamente en función del diseño utilizado por dispositivo
  • Problema de desplazamiento de GridView en Android
  • Pinterest estilo listview o gridview en android
  • ¿Cómo hacer una galería de imágenes de 2 dimensiones con desplazamiento horizontal y vertical?
  • 5 Solutions collect form web for “Android: ¿Cómo GridView auto_fit encuentra el número de columnas?”

    En cuanto a la fuente GridView, está claro que la configuración del relleno y la altura en su ImageView no le ayudará en absoluto. Cuando no se especifica un ancho de columna, sólo elige un número predeterminado 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 la columna antes de establecer el ancho de la columna de GridView. Esta es una manera rápida de medir vistas fuera de la 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; } 

    A continuación, sólo tiene que establecer el ancho de la columna de GridView:

     gridView.setColumnWidth( width ); 

    De acuerdo con el android: numColumns documentación

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

    Así que si inserta ImageView con

    padding establecido a zero

    margin establecido a zero

    layout_width establecido en wrap_content

    layout_height establecido en wrap_content

    El gridView debe contener el número máximo posible de niños


    Tenga en cuenta Su ImageViews tal vez están recibiendo escalado (:

    Esto puede ayudar a alguien … Necesita encontrar el tamaño de ancho manualmente. Con base en el tamaño de ancho se puede establecer 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); 

    Me parece que por lo general sé lo ancho que quiero que mis columnas para ser. Ya sé el tamaño de mis imágenes o dejo que el usuario determinar ese tamaño. Por lo tanto puedo apenas fijar la anchura 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 un ajuste de texto para los editores de texto. Si la imagen no puede encajar en el último tamaño de columna, la imagen fluye a la siguiente fila. Sin embargo, si establece el atributo numcolumns en un número, la cuadrícula puede estirar / ajustar las columnas (stretchModde es otra propiedad que puede utilizar conjuntamente).

    Ps – aunque haya marcado la respuesta, estaría encantado de saber si esto ayudó.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.