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
- Android MGBox2 biblioteca equivalente?
- Cómo manejar gestos de desplazamiento para gridview (android)
- GridView error en el espaciado horizontal
- Conseguir que Picasso recupere las imágenes futuras
- No se puede obtener gridView en el elemento de escucha de clics
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
- Soluciones para GridView.scrollTo ()?
- Vista de cuadrícula personalizada con rango de fila y extensión de columna
- Android GridView - actualizar Vista basada en la posición
- ¿Cómo hacer deslizar la pantalla como picasso?
- ¿Por qué hay pixeles adicionales alrededor de mi Android GridView?
- ¿Cómo implementar Galería de imágenes en GridView en android?
- Hacer una vista de imagen extensible en gridview
- Estoy recibiendo este error.DraggableGridView no instanciar
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; }