CardView layout_width = “match_parent” ne correspond pas à la largeur du RecyclerView parent

J’ai un fragment avec contient RecyclerView avec layout_width = “match_parent”:

 

L’élément dans RecyclerView est également un CardView avec layout_width = “match_parent”:

    

Je gonfle la vue de l’article comme ci-dessous:

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

Mais quand je lance l’application, le CardView est rendu comme wrap_content comme indiqué ci-dessous:

Cartes

Notez que cela a été exécuté sur un émulateur, pas un périphérique réel.

Est-ce que je fais quelque chose de mal ou est-ce un bug?

Les documents pour inflate :

Gonflez une nouvelle hiérarchie de vues à partir de la ressource xml spécifiée. Lance InflateException en cas d’erreur.

Paramètres
ID de ressource pour une ressource de disposition XML à charger (par exemple, R.layout.main_page)
view to est le parent de la hiérarchie générée (si attachToRoot a la valeur true), ou simplement un object qui fournit un ensemble de valeurs LayoutParams pour root de la hiérarchie renvoyée (si attachToRoot est false).
attachToRoot Indique si la hiérarchie gonflée doit être associée au paramètre racine. Si la valeur est false, root est uniquement utilisé pour créer la sous-classe correcte de LayoutParams pour la vue racine dans le XML. Renvoie la vue racine de la hiérarchie gonflée. Si root a été fourni et que attachToRoot a la valeur true, il s’agit de root; sinon c’est la racine du fichier XML gonflé.

Il est important de ne pas fournir de données vraies, mais de fournir le parent:

 LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem, parent, false); 

Le fait de fournir la vue parent permet à l’inflater de savoir quels templates doivent être utilisés. La fourniture du paramètre false indique de ne pas l’ attacher au parent pour l’instant. C’est ce que le RecyclerView fera pour vous.

Utilisez RelativeLayout comme parent immédiat de CardView.

     

Cela a fonctionné pour moi,

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

La façon dont je l’ai fait est la suivante:

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

Explication: Dans votre onCreateViewHolde, une fois que vous obtenez l’affichage de la carte, obtenez la largeur de l’écran, puis définissez le paramètre de disposition en conséquence pour l’affichage de la carte.

Cela semble être corrigé dans 'com.android.support:recyclerview-v7:23.2.1'

Voir: RecyclerView wrap_content pour plus de discussions.

Il suffit de définir de nouveaux parameters de mise en page

 view.setLayoutParams(new RecyclerView.LayoutParams( RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT )); 

Cela fonctionne pour moi

 View view = inflator.inflate(R.layout.layout_item, ***null***, false); 

L’implémentation par défaut force l’utilisation de wrap_content dans le gestionnaire de disposition par défaut:

  @Override public LayoutParams generateDefaultLayoutParams() { return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); } 

Tout ce que vous avez à faire est de remplacer cette méthode dans votre LayoutManager comme ceci:

  @Override public LayoutParams generateDefaultLayoutParams() { return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } 

Utilisez card_view: contentPadding avec une valeur négative

  

Ça a fonctionné pour moi

Wrap CardView dans une mise en page avec la largeur: match_parent