¿Cómo hacer que el elemento de la cuadrícula de RecyclerView tenga la misma altura y anchura?

Definir mi RecyclerView como cuadrícula mediante la configuración de su diseño con GridLayoutManger que tiene una cuenta de alcance de 3 que ya están funcionando bien. También agrego un decorador del artículo a mi opinión del reciclador que maneje el espaciamiento entre los artículos de la rejilla, esto también trabaja muy bien.

 public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { private int spanCount; private int spacing; private boolean includeEdge; public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { this.spanCount = spanCount; this.spacing = spacing; this.includeEdge = includeEdge; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // item position int column = position % spanCount; // item column if (includeEdge) { outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing) outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) if (position < spanCount) { // top edge outRect.top = spacing; } outRect.bottom = spacing; // item bottom } else { outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing) outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) if (position >= spanCount) { outRect.top = spacing; // item top } } } } 

Mi implementación para añadir decoración de artículos a mi Recycler View:

 mBuddiesGrid = (RecyclerView) findViewById(R.id.buddies_grid); mLayoutManager = new GridLayoutManager(getApplicationContext(), 3); mBuddiesGrid.addItemDecoration(new GridSpacingItemDecoration(3, (int) dpToPx(10) , true)); mBuddiesAdapter = new BuddiesGridAdapter(getApplicationContext(), new Buddies()); mBuddiesGrid.setLayoutManager(mLayoutManager); 

Mi elemento de cuadrícula xml layout:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:layout_weight="1" android:cropToPadding="false" android:id="@+id/profile_picture" android:scaleType="centerCrop" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:text="Theodore" android:includeFontPadding="false" android:textColor="@android:color/black" android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

Mediante la adición de espacios entre el elemento de la cuadrícula se ajustará el ancho del elemento de cuadrícula que posiblemente puede causar de no obtener el tamaño de la proporción de mi punto de vista. Lo que quiero obtener es cambiar el tamaño de la altura de mi elemento de cuadrícula igual a su anchura de forma dinámica. ¿Cómo puedo hacerlo?

Una forma de asegurar la igualdad de ancho / altura es usar una vista personalizada que calcule la altura en función de su anchura cuando se llama onMeasure() . La cosa aseada con esto es que aparte de crear la vista personalizada, no hay ninguna codificación involucrada.

Esta es una vista personalizada que extiende LinearLayout :

 public class SquareLayout extends LinearLayout { public SquareLayout(Context context) { super(context); } public SquareLayout(Context context, AttributeSet attrs) { super(context, attrs); } public SquareLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int width, int height) { // note we are applying the width value as the height super.onMeasure(width, width); } } 

Aquí está una versión alterada de su disposición del artículo de la rejilla, usando el LinearLayout encargo LinearLayout :

 <com.yourpackage.name.views.SquareLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/profile_picture" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:cropToPadding="false" android:scaleType="centerCrop" /> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:includeFontPadding="false" android:textColor="@android:color/black" android:text="Theodore"/> </com.yourpackage.name.views.SquareLayout> 

Puede escribir código en la función "onBindViewHolder" en el titular de la vista de reciclador. En que puede obtener el observador de árbol de vista de la vista de reciclador y cambiar el ancho o (y) la altura de la vista de elemento de reciclador.

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