Android GridVIew Cambiar el número de columnas según la orientación

Quiero mostrar 6 imágenes en forma de cuadrícula como sigue.

En orientación vertical, 2 cuchillas, 3 filas y en orientación de jardinería 3 columnas, 2 filas

Mediante el uso de Android GridView y definiendo diferentes diseños de cuadrícula en los directorios de layout-port y layout-land, pude lograr este efecto.

Más tarde según mi requisito de la actividad, agregué un parámetro en manifest.xml que es

android:configChanges = "mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale|screenSize"` 

Para detener mi actividad para recrear una vez que cambie la orientación de la pantalla.

Después de agregar este parámetro, mi vista de cuadrícula no se comporta de manera esperada. A veces muestra 1 columna, a veces 2 columnas ya veces 3 columnas.

Estoy colocando los gridView.setNumberOfColumns(2) o gridView.setNumberOfColumns(3) en el método get view de mi adaptador de rejilla en función de la orientación del dispositivo.

Por favor, ayúdame a lograr este efecto sin eliminar el parámetro android:configChanges en Manifest.xml

Utilice el poderoso sistema de recursos.

En la disposición xml, establezca el número de columnas en un recurso entero y, a continuación, en /values/integers.xml establezca en 2 para el retrato y en /values-land/integers.xml establezca en 3 para el paisaje

// bueno, si haces configChanges en manifesto, tendrás que cambiar el recuento de columnas de java en onConfogurationChanged

 @Override public void onConfigurationChanged(Configuration newConfig) { grid.setNumColumns(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2); super.onConfigurationChanged(newConfig); } 

Puede establecer el número de columnas usando

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

Mi solución:

Values ​​/ dimens.xml:

 <resources> <dimen name="grip_view_entry_size">160dp</dimen> <dimen name="grip_view_spacing">10dp</dimen> </resources> 

Layout / gridview.xml

 <GridView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:verticalSpacing="@dimen/grip_view_spacing" android:horizontalSpacing="@dimen/grip_view_spacing" android:stretchMode="columnWidth" android:gravity="center" android:scrollingCache="false" android:fastScrollEnabled="true" android:animationCache="false"/> 

En su fragmento:

 private void refreshGridView() { int gridViewEntrySize = getResources().getDimensionPixelSize(R.dimen.grip_view_entry_size); int gridViewSpacing = getResources().getDimensionPixelSize(R.dimen.grip_view_spacing); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int numColumns = (display.getWidth() - gridViewSpacing) / (gridViewEntrySize + gridViewSpacing); gridView.setNumColumns(numColumns); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); refreshGridView(); } @Override public void onResume() { super.onResume(); refreshGridView(); } 
  @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.lay_vertical); } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { setContentView(R.layout.lay_horizontal); } }; 

A continuación, cargue los datos en gridview de nuevo según su necesidad.

Poner android: configChanges = "orientación" para ese nodo de actividad en el manifiesto.

Mientras utiliza android: configChanges = "orientación" en el manifiesto su actividad no se recrea en la orientación cambiada (de paisaje a retrato o viceversa). Si no desea eliminar esta etiqueta de manifiesto debe tener que anular onConfigchanged y poner algún código de lógica allí.

Lo hice basado en el tamaño de la pantalla, no ppp

 public static int getColumns(boolean landscape, Context context){ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); float hi=displayMetrics.heightPixels/displayMetrics.xdpi; float wi=displayMetrics.widthPixels/displayMetrics.ydpi; float screenWidthInch = landscape ? Math.max(wi, hi) : Math.min(wi, hi); float screenWidthCm = screenWidthInch * 2.54f; int columns = (int)(screenWidthCm/2); return columns < 3 ? 3 : columns; } 
  • Cómo configurar el borde de GridView en Android
  • Problema de desplazamiento de GridView en Android
  • GridView dentro de la lista expandible en android
  • Cómo desmarcar un elemento en gridview en segundo clic en android?
  • Ejemplo simple de red de Android con RecyclerView con GridLayoutManager (como el GridView antiguo)
  • OnClickListener del primer elemento de GridView no funciona
  • Mostrar datos en android utilizando gridview desde la base de datos
  • Android ImageAdapter con Gridview en el fragmento
  • Cómo crear AsymmetricGridView con diferentes tamaños de imagen en fila
  • Android: cómo crear GridView
  • GridView VS GridLayout en Aplicaciones de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.