CardView disposition width="match parent" ne correspond pas parent RecyclerView largeur

j'ai un fragment avec contient un RecyclerView avec 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" />

L'élément dans le RecyclerView est un CardView aussi avec 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>

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 j'exécute l'application, CardView est rendu wrap_content comme suit:

CardsBug

notez que cela a été exécuté sur un émulateur, pas un vrai appareil.

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

104
demandé sur ProgrAmmar 2014-07-01 10:31:36

10 réponses

Les docs pour inflate :

gonfle une nouvelle hiérarchie de vues à partir de la ressource xml spécifiée. Jeter InflateException en cas d'erreur.

Paramètres

ressource ID XML disposition de ressources de la charge (par ex., R. layout.main_page) racine

vue à être le parent de l' hiérarchie générée (si attachToRoot est vrai), ou simplement un objet qui fournit un ensemble de valeurs LayoutParams pour la racine du la hiérarchie retournée (si attachToRoot est fausse.)

attachToRoot si la hiérarchie gonflée doit être attachée au paramètre racine? Si false, root n'est utilisé que pour créer la bonne sous-classe de LayoutParams pour la vue racine dans le fichier XML. Renvoie la vue racine de la hiérarchie gonflée. Si root a été fourni et attachToRoot est vrai, c'est root; sinon, c'est la racine du fichier XML gonflé.

il est important ici de pas approvisionnement vrai, mais do fournir le parent:

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

fournit la vue parent permet au gonfleur de savoir quel layoutparams utiliser. Fournir le paramètre false lui dit de pas attachez-le au parent tout de suite. C'est ce que l' RecyclerView fera l'affaire.

262
répondu nhaarman 2014-07-01 06:55:41

utilisez RelativeLayout comme parent immédiat de CardView.

<RelativeLayout 
    android:layout_width="match_parent" ... >
    <CardView 
        android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>
48
répondu Ganesh Kanna 2017-09-25 11:43:49

ça a marché 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);
11
répondu anurag_dake 2016-09-24 16:53:20

Le chemin que j'ai fait c'est:

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 avez la vue de carte, obtenez la largeur de l'écran et définissez le paramètre layout en conséquence pour la vue de carte.

6
répondu Rahul 2015-12-31 21:11:17

cette valeur semble être fixée dans 'com.android.support:recyclerview-v7:23.2.1'

voir RecyclerView wrap_content pour d'autres discussions.

5
répondu speedynomads 2017-05-23 12:18:28

il suffit de définir de nouveaux paramètres de mise en page

view.setLayoutParams(new RecyclerView.LayoutParams(
    RecyclerView.LayoutParams.MATCH_PARENT,
    RecyclerView.LayoutParams.WRAP_CONTENT
));
4
répondu V. Kalyuzhnyu 2016-11-09 13:16:19

Cela fonctionne pour moi

View view = inflator.inflate(R.layout.layout_item, ***null***, false);
2
répondu DiRiNoiD 2016-07-21 20:43:30

force D'implémentation par défaut l'utilisation de wrap_content dans le gestionnaire de mise en page 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 surcharger cette méthode dans votre LayoutManager comme ceci:

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}
2
répondu issamux 2017-11-05 16:34:35

utiliser card_view: contentPadding avec une valeur négative

<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">

Il a travaillé pour moi

1
répondu Vladimir Salguero 2016-09-14 16:16:25

Wrap CardView dans un plan ayant une largeur: match_parent

-1
répondu Samuel Moshie 2016-07-26 07:24:25