RecyclerView item width layout_width = "match_parent" ne correspond pas à parent

J'utilise RecyclerView et j'essaie de faire l'élément de largeur de RecyclerView match_parent depuis que j'utilise

LinearLayoutManager.HORIZONTAL

RecyclerViser les objets après l'exécution

<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 “RecyclerView item width layout_width = "match_parent" ne correspond pas à parent”

J'ai réparé le problème:

1- Obtenez la taille de l'écran (largeur).

2- Créez la largeur ViewHolder identique à celle de l'écran.

Au-dessous de mon code si quelqu'un en a besoin.

 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)); 

Remarque: voir la mise à jour à la fin de cette publication.


Ancienne réponse:

Les suivants ont fonctionné pour moi:

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

, Juste après avoir gonflé la vue 'view'.

Il prend essentiellement la largeur du parent et remplace la disposition_width de la nouvelle vue avec la largeur du parent.

Vous pouvez également ajouter une vérification pour MATCH_PARENT, pour vous assurer qu'il s'affiche correctement au cas où vous modifiez le XML à une largeur différente à l'avenir. Donc, comme ceci:

  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); } 

Cela ne fera que la largeur parentale si la largeur était MATCH_PARENT avant cela.

MODIFIER:

Faites attention à l'utilisation excessive de ce correctif, car une variation de celui-ci m'a causé un bug de mise en page. J'ai fait ça:

  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); } 

Cela a fonctionné, mais il n'a pas mis à jour la largeur et la hauteur lorsque RecyclerView a été redimensionnée. Par conséquent, une des deux corrections à ce correctif peut être appliquée:

  1. Vérifiez l'orientation de l'adaptateur RecyclerView, et ne faites que ce parent.getHeight (), etc., pour les dimensions le long de laquelle le défilement est autorisé.
  2. Ou, quelque part dans le ViewHolder, enregistrez l'original 'width' et 'height', puis redessinez cette étape à chaque fois dans la méthode onBindViewHolder ().

Le correctif suivant semble fonctionner:

  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. } 

Notez également: si vous utilisez cette approche de redimensionnement à l'intérieur de la méthode onBindViewHolder () , vous devrez également obtenirAdapter () .notifyDataSetChanged () dans l' Activity.onSizeChanged () !

En bref, l'idée principale est: vérifier MATCH_PARENT sur chaque liaison , pas seulement sur créer un titulaire de vue. De cette façon, le redimensionnement du RecyclerView fonctionne également.


MISE À JOUR: à partir de RecyclerView v7: 23.2.1 au moins, il semble qu'ils l'ont corrigé afin que maintenant ces correctifs personnalisés ne soient plus nécessaires. RecyclerView doit maintenant reconnaître les paramètres WRAP_CONTENT et MATCH_PARENT.

Supprimez ceci dans la mise en page.

 android:layout_weight="1" 

Et définissez les paramètres de mise en page pour l'élément dans l'adaptateur une fois de plus.

 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; 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.