CardView layout_width = "match_parent" no coincide con el ancho de RecyclerView padre
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 el RecyclerView es un CardView también con layout_width = "match_parent":
- Recylerview no visible dentro de scrollview o nestedScrollview
- Reciclar vista - java.lang.NullPointerException
- Fragmento dinámico de Android Google Maps en el soporte de RecyclerView
- ¿Agregar un nuevo elemento a recyclerview de forma programática?
- Enumera el alineamiento de elementos con Recycler View
<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>
Hincho la vista del artículo como abajo:
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 un dispositivo real.
¿Estoy haciendo algo mal, o es un error?
- ¿Cómo utilizar ItemAnimator en un RecyclerView?
- Picasso problema de extracción de imágenes cuando se utiliza con RecyclerView
- Los elementos de RecyclerView desaparecen después de cambiar entre fragmentos
- Cómo crear un menú contextual para RecyclerView
- Error de Android RecyclerView
- Span múltiples columnas con RecyclerView
- Detectar acabado de animación en RecyclerView de Android
- Cómo asignar una lista de lista a RecyclerView
Los documentos para inflate
:
Inflar una nueva jerarquía de vista desde el recurso xml especificado. Lanza InflateException si hay un error.
Parámetros
ID de recurso para un recurso de diseño XML para cargar (por ejemplo, R.layout.main_page) root
(Si attachToRoot es true), o simplemente un objeto que proporciona un conjunto de valores de LayoutParams para la raíz de la jerarquía devuelta (si attachToRoot es false.)
AttachToRoot Si la jerarquía inflada se debe asociar al parámetro raíz? Si es falso, root sólo se utiliza para crear la subclase correcta de LayoutParams para la vista raíz en el XML. Devuelve La vista raíz de la jerarquía inflada. Si root fue suministrado y attachToRoot es true, esto es root; De lo contrario, es la raíz del archivo XML inflado.
Es importante aquí no suministrar la verdad, pero sí suministrar a los padres:
LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem, parent, false);
El suministro de la vista parent
permite al inflador saber qué layoutparams usar. Al suministrar el parámetro false
se le dice que no lo adjunte todavía al padre. Eso es lo que el RecyclerView
hará por usted.
Disposición relativa del usuario como la vista inmediata de padre a tarjeta.
La forma en que lo hice es:
View view = mInflater.inflate(R.layout.row_cardview, null, true); WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); int width = windowManager.getDefaultDisplay().getWidth(); view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT));
Explicación: En su onCreateViewHolde una vez que obtenga la vista de la tarjeta, obtenga el ancho de la pantalla y, a continuación, establezca el parámetro de diseño según la vista de la tarjeta.
Esto funcionó para mí,
View viewHolder= LayoutInflater.from(parent.getContext()) .inflate(R.layout.item, null, false); viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)); return new ViewOffersHolder(viewHolder);
Esto parece fijarse en 'com.android.support:recyclerview-v7:23.2.1'
Vea: RecyclerView wrap_content para más discusiones.
Esto funciona para mí
View view = inflator.inflate(R.layout.layout_item, ***null***, false);
Simplemente configure nuevos parámetros de diseño
view.setLayoutParams(new RecyclerView.LayoutParams( RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT ));
Usar card_view: contentPadding con un valor negativo
<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:layout_width="match_parent" card_view:contentPadding="-4dp" card_view:cardElevation="0dp" android:layout_height="wrap_content">
Funcionó para mí
Implementación predeterminada force wrap_content en el gestor de diseño predeterminado utilizado por RecycelerView como se ve en el código fuente
@Override public LayoutParams generateDefaultLayoutParams() { return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); }
Haga todo lo que tiene que hacer es anular este método en su LayoutManager y volver como:
@Override public LayoutParams generateDefaultLayoutParams() { return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); }
Envuelva CardView
en un diseño que tenga anchura: match_parent
- Diferencia entre android-support-v7-appcompat y android-support-v4
- ¿Qué es mejor: @SuppressLint o @TargetApi?