Tengo un fragmento con contiene un RecyclerView con layout_width = "match_parent":
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity$PlaceholderFragment" />
El elemento en RecyclerView es un CardView también con layout_width = "match_parent":
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
card_view:cardCornerRadius="4dp">
<TextView
android:layout_gravity="center"
android:id="@+id/info_text"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
android:textAppearance="?android:textAppearanceLarge"/>
</android.support.v7.widget.CardView>
Inflo la vista del elemento de la siguiente manera:
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
CardView v = (CardView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_listitem, null, true);
ViewHolder vh = new ViewHolder(v);
return vh;
}
Pero cuando ejecuto la aplicación, el CardView se representa como wrap_content como se muestra a continuación:
Tenga en cuenta que esto se ejecutó en el emulador, no en un dispositivo real.
¿Estoy haciendo algo mal o es un error?
Respuestas:
Los documentos para
inflate
:Aquí es importante no suministrar verdadero, pero sí el padre:
Al proporcionar la
parent
vista, el inflador sabe qué parámetros de diseño usar. Proporcionar elfalse
parámetro le dice que no lo adjunte al padre por el momento. Eso es loRecyclerView
que hará por ti.fuente
layout_width
erawrap_content
. ¡Es extraño porque esto no debería afectar la vista de lista! Entonces, entiendo que cuando proporciona falso como parámetro al layoutinflater, ¡ListView agrega los elementos de lista a ListView con parámetros de diseño que coinciden con ListView! : 0ViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
Utilice RelativeLayout como padre inmediato de CardView.
fuente
Esto funcionó para mí
fuente
La forma en que lo hice es:
Explicación: en su onCreateViewHolde una vez que obtenga la vista de tarjeta, obtenga el ancho de la pantalla y luego configure el parámetro de diseño en consecuencia para la vista de tarjeta.
fuente
Esto parece estar arreglado en
'com.android.support:recyclerview-v7:23.2.1'
Ver: RecyclerView wrap_content para más discusiones.
fuente
Simplemente configure nuevos parámetros de diseño
fuente
La implementación predeterminada fuerza el uso de wrap_content en el administrador de diseño predeterminado:
Todo lo que tiene que hacer es anular este método en su LayoutManager de esta manera:
fuente
Esto funciona para mi
fuente
Use card_view: contentPadding con un valor negativo
Funciono para mi
fuente
Envuelva
CardView
en un diseño que tenga ancho:match_parent
fuente