android xml imageview android-imageview android-cardview

Android: cómo incorporar CardViews con ImageViews en una grilla



xml android-imageview (1)

Tengo algunas imágenes cuadradas y quiero ponerlas en filas de 3 que se ajusten al ancho de la pantalla, manteniendo la relación de aspecto de las imágenes. Esto se puede hacer con bastante facilidad. Sin embargo, también quiero poner cada ImageView en un CardView (tarjetas cuadradas), pero cuando lo hago, hay problemas. En lugar de ser la altura de la imagen, la tarjeta es realmente larga. No estoy seguro de lo que salió mal aquí. Debajo está el código que funcionó hasta que puse el primer ImageView en un CardView.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android"> <android.support.v7.widget.CardView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <ImageView android:src="@drawable/square1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/main_dark" android:adjustViewBounds="true" /> </android.support.v7.widget.CardView> <ImageView android:src="@drawable/square2" android:layout_width="0dp" android:layout_height="wrap_content" android:background="@color/main" android:layout_weight="1" android:adjustViewBounds="true"/> <ImageView android:src="@drawable/square3" android:layout_width="0dp" android:layout_height="wrap_content" android:background="@color/main_light" android:layout_weight="1" android:adjustViewBounds="true"/> </LinearLayout>


Como quiere tres vistas por fila, independientemente del ancho de la fila, y quiere que todas sean cuadradas, puede usar una vista de tarjeta personalizada y anular onMeasure () para forzar una relación de aspecto de 1: 1.

package com.example.view; public class SquareCardView extends CardView { public SquareCardView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int ignoredHeightMeasureSpec) { int newHeightMeasureSpec = widthMeasureSpec; super.onMeasure(widthMeasureSpec, newHeightMeasureSpec); } }

Luego usa:

<com.example.view.SquareCardView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <ImageView android:src="@drawable/square1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/main_dark" android:adjustViewBounds="true" /> </com.example.view.SquareCardView>

No dice que deberías , pero podrías .