Ancho del elemento RecyclerView layout_width = "match_parent" no coincide con el padre

Estoy usando RecyclerView y estoy tratando de hacer el artículo de ancho de RecyclerView match_parent ya que estoy usando

LinearLayoutManager.HORIZONTAL

RecyclerVer elementos después de ejecutarse

<android.support.v7.widget.RecyclerView android:id="@+id/listOffersHits" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Custom_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <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_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1" android:layout_margin="2dp" card_view:cardCornerRadius="2dp"> <ImageView android:id="@+id/offerImage" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/item_selector" android:scaleType="fitXY" android:src="@drawable/offer" /> </android.support.v7.widget.CardView> 

LayoutManager

  LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false); listOffersHits.setLayoutManager(linearLayoutManager); 

ViewHolder

 View view= LayoutInflater.from(parent.getContext()) .inflate(R.layout.custom_layout, parent, false); ViewOffersHolder viewHolder=new ViewOffersHolder(view); return viewHolder; 

3 Solutions collect form web for “Ancho del elemento RecyclerView layout_width = "match_parent" no coincide con el padre”

He arreglado el problema:

1- Obtener el tamaño de la pantalla (ancho).

2- haga que el ancho de ViewHolder sea igual que el tamaño de pantalla.

Debajo de mi código si alguien lo necesita.

 WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); int width = windowManager.getDefaultDisplay().getWidth(); int height = windowManager.getDefaultDisplay().getHeight(); view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT)); 

Nota: Consulte la actualización al final de esta publicación.


Vieja Respuesta:

Lo siguiente funcionó para mí:

 view.getLayoutParams ().width = parentViewGroup.getWidth (); 

, Justo después de inflar la vista 'vista'.

Básicamente toma el ancho del padre y reemplaza el layout_width de la nueva vista con el ancho del padre.

También puede agregar una comprobación para MATCH_PARENT, para asegurarse de que aparece correctamente en caso de que modifique el XML a un ancho diferente en el futuro. Así como esto:

  public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { View vItem = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.bookmark_card, parent, false); if (vItem.getLayoutParams ().width == RecyclerView.LayoutParams.MATCH_PARENT) vItem.getLayoutParams ().width = parent.getWidth (); return new ViewHolder (vItem); } 

Sólo lo hará el ancho del padre si el ancho era MATCH_PARENT antes de esto.

EDITAR:

Tenga cuidado con el uso excesivo de esta corrección, ya que una variación de la misma me ha causado un error de diseño. Hice esto:

  public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { View vItem = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.page_tile, parent, false); if (vItem.getLayoutParams ().width == RecyclerView.LayoutParams.MATCH_PARENT) vItem.getLayoutParams ().width = parent.getWidth (); if (vItem.getLayoutParams ().height == RecyclerView.LayoutParams.MATCH_PARENT) vItem.getLayoutParams ().height = parent.getHeight (); return new ViewHolder (vItem); } 

Eso funcionó, pero no actualizó el ancho y la altura cuando el RecyclerView fue cambiado de tamaño. Por lo tanto, se puede aplicar una de las dos correcciones a esta corrección:

  1. Compruebe la orientación del adaptador RecyclerView y sólo haga esto parent.getHeight (), etc., para las dimensiones a lo largo de las cuales se permite el desplazamiento.
  2. O bien, en algún lugar del ViewHolder, guarde el original 'width' y 'height', y luego vuelva a hacer este paso cada vez en el método onBindViewHolder ().

La siguiente solución parece funcionar:

  public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { View vItem = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.page_tile, parent, false); ViewHolder holder = new ViewHolder (vItem); // Create view holder. holder.vItem = vItem; // Save top-level View. holder.vParent = parent; // Save its parent. ViewGroup.LayoutParams lp = vItem.getLayoutParams (); if (lp != null) { // Save the original width and height from lp: holder.originalWidth = lp.width; holder.originalHeight = lp.height; refreshLayoutParams (holder); // Check for MATCH_PARENT. } else holder.originalHeight = holder.originalWidth = 0; return holder; } public void onBindViewHolder (ViewHolder holder, int position) { ... do work here ... refreshLayoutParams (holder); // Check AGAIN for MATCH_PARENT. } private void refreshLayoutParams (ViewHolder holder) { ViewGroup.LayoutParams lp = holder.vItem.getLayoutParams (); View parent = holder.vParent; if (parent == null) return; // Is there a parent to check against? if (lp == null) holder.vItem.setLayoutParams (lp = new RecyclerView.LayoutParams (holder.originalWidth, holder.originalHeight)); if (holder.originalWidth == RecyclerView.LayoutParams.MATCH_PARENT) lp.width = parent.getWidth (); // Check width. if (holder.originalHeight == RecyclerView.LayoutParams.MATCH_PARENT) lp.height = parent.getHeight (); // Check height. } 

Nota También: Si utiliza este enfoque de redimensionamiento dentro del método onBindViewHolder () , también tendrá que getAdapter () .notifyDataSetChanged () dentro de Activity.onSizeChanged () !

En resumen, la idea principal es: comprobar MATCH_PARENT en cada enlace , no sólo en create view holder. De esta manera redimensionar el RecyclerView funciona también.


ACTUALIZACIÓN: A partir de RecyclerView v7: 23.2.1 al menos, parece que lo han arreglado para que ahora estas correcciones personalizadas ya no son necesarias. RecyclerView debería reconocer ahora tanto la configuración WRAP_CONTENT como la configuración MATCH_PARENT.

Quite esto en el diseño.

 android:layout_weight="1" 

Y configurar parámenes de diseño para el artículo en el adaptador una vez más.

 View view= LayoutInflater.from(parent.getContext()) .inflate(R.layout.custom_layout, parent, false); view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT)); ViewOffersHolder viewHolder=new ViewOffersHolder(view); return viewHolder; 
  • Pantalla Android Parpadea en mostrar / ocultar barras del sistema
  • ¿Cómo extracto el texto de un xml anidado usando xmlpullparser en android?
  • Mensaje de error XML de Android
  • Cómo agregar etiquetas en XML en Android?
  • Android Maps: No se pudo cargar el mapa. No se pudo contactar con los servidores de Google
  • Lectura y escritura de archivos XML
  • Implementación de múltiples fragmentos en una sola actividad Dinámicamente
  • ¿Hay un equivalente a setColorFilter () en XML?
  • Android SAX Parsing: Cómo conservar Newlines desde dentro de una etiqueta CDATA
  • Android Studio: Problemas de renderización
  • Android: ¿Cómo navegar de nuevo desde la sub-pantalla de preferencia a través de la barra de acción en xml?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.