match_parent width ne fonctionne pas dans RecyclerView


135

Mon RecyclerView et mon article ont une largeur match_parent mais le résultat est: entrez la description de l'image ici

    <view
    class="android.support.v7.widget.RecyclerView"
    android:layout_width="match_parent"

et articles:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_itm"
android:orientation="horizontal"
android:layout_width="match_parent"

plein:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:id="@+id/ll_itm"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="100"
android:gravity="right"
>


<Button
    android:layout_width="0dp"
    android:layout_weight="15"
    android:layout_height="fill_parent"
    android:text="ملاحظات"
    android:id="@+id/button" />

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="20"
    android:gravity="center"
    >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >

        <com.getbase.floatingactionbutton.FloatingActionButton
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            fab:fab_plusIconColor="#ff56ff83"
            fab:fab_colorNormal="@color/d_red"
            fab:fab_colorPressed="#ff5c86ff"
            fab:fab_size="mini"
            fab:fab_icon="@drawable/ic_remove_white"
            android:id="@+id/fab_rmv" />
        <esfandune.ir.elmikarbordiardakan.other.CustomTxtView
            android:layout_weight="25"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="0"
            android:gravity="right|center_vertical"
            android:id="@+id/txt_takhir_itm" />
        <com.getbase.floatingactionbutton.FloatingActionButton
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            fab:fab_plusIconColor="@color/colorprimarylight"
            fab:fab_colorNormal="@color/colorprimarydark"
            fab:fab_colorPressed="@color/colorprimary"
            fab:fab_size="mini"
            fab:fab_icon="@drawable/ic_add_white"
            android:id="@+id/fab_add" />

    </LinearLayout>
</LinearLayout>
    <Spinner
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="10"
        android:id="@+id/sp_nomre_itm"

        android:entries="@array/degrees"/>


<LinearLayout
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="10"
    android:gravity="center"
    >
    <!--LinearLayout baraye ine ke nameshod fab ro weight behosh dad-->
    <com.getbase.floatingactionbutton.FloatingActionButton
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        fab:fab_plusIconColor="#ff56ff83"
        fab:fab_colorNormal="@color/d_green"
        fab:fab_colorPressed="@color/d_orange"
        fab:fab_size="normal"
        fab:fab_icon="@drawable/ic_done_white"
        android:id="@+id/fab_hazr" />



</LinearLayout>
<esfandune.ir.elmikarbordiardakan.other.CustomTxtView
    android:layout_weight="5"
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="100"
    android:gravity="right|center_vertical"
    android:id="@+id/txt_ghybtNumber_itm" />

<esfandune.ir.elmikarbordiardakan.other.CustomTxtView
        android:layout_weight="30"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="عباسعلی ملاحسینی اردکانی"
        android:gravity="right|center_vertical"
        android:id="@+id/txt_title_itm"
    android:layout_marginRight="10dp"
    />

<view
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:layout_weight="10"
    class="de.hdodenhof.circleimageview.CircleImageView"
    android:id="@+id/view"
    android:src="@drawable/mmrdf"
   />
</LinearLayout>

Réponses:


434

Dans votre adaptateur où vous gonflez l'article onCreateViewHolder, est le deuxième paramètre de l' inflateappel null?.

Si c'est le cas, changez-le en parentquel est le premier paramètre de la onCreateViewHoldersignature de la fonction.

View rootView = LayoutInflater.from(context).inflate(R.layout.itemLayout, parent, false);

Si vous avez besoin du deuxième paramètre, nulllorsque vous obtenez la référence de vue sur le gonflage, procédez comme suit

View rootView = LayoutInflater.from(context).inflate(R.layout.itemLayout, null, false);
RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
rootView.setLayoutParams(lp);
return new RecyclerViewHolder(rootView);

1
Cela ne fonctionne pas pour moi: si je mets ma rootView de l'élément à width = "match_parent" mais ça "marche" si je le mets à 500dp par exemple. Une idée ? OK, cela ne fonctionne pas avec un LinearLayout mais avec un relativeLayout sur l'élément ... wtf?
Cocorico

5
Sry, comme cela fonctionne avec relativeLayout, je change juste LinearLayout en RelativeLayout. Mais RecyclerView était match_parent, et l'élément rootView (donc LinearLayout) était également Match_parent et cela ne fonctionnait pas. La première fois que j'ai fait face à cela.
Cocorico

1
Oh super, ça marche ... après m'être tiré les cheveux pendant une heure.
Zhi Kai

4
Oui, comme mentionné précédemment, pour une raison quelconque, cela ne fonctionnait pas avec un LinearLayout et le basculer vers un RelativeLayout avec ce correctif semblait faire l'affaire.
Nick Peppers

11
Cela ne fonctionne pas avec Linearlayout ou Constrainlayout. J'ai dû passer à Relativelayout et puis cela a fonctionné
ymerdrengene

18

À l'intérieur de la méthode onCreateViewHolder (...) de l'adaptateur où vous gonflez la vue .. vous devez définir le ViewGroup comme parent.Ce que vous obtiendrez à partir du 1er paramètre de la méthode onCreateViewHolder (...).

voir la ligne ci-dessous dans le deuxième paramètre je passe le ViewGroup. Cela fera automatiquement correspondre la vue à son parent:

rowView=inflater.inflate(R.layout.home_custom_list, parent,false);

/// le code complet est ci-dessous

public View onCreateViewHolder(ViewGroup parent, int position) {
    // TODO Auto-generated method stub
    View rowView;
        LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView=inflater.inflate(R.layout.home_custom_list, parent,false);

8

J'utilisais un FrameLayoutavec MATCH_PARENTpour la largeur et voyais le même comportement avec un RecyclerView+ LinearLayoutManager. Aucune des modifications ci-dessus n'a fonctionné pour moi jusqu'à ce que je fasse ce qui suit dans le onCreateViewHolderrappel:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
                           .inflate(R.layout.note_layout, parent, false);
    v.setLayoutParams(new RecyclerView.LayoutParams(
          ((RecyclerView) parent).getLayoutManager().getWidth(),
          context.getResources()
                 .getDimensionPixelSize(R.dimen.note_item_height)));

    return new ViewHolder(v);
}

Ressemble clairement à un bogue dans (je suppose) l'implémentation de RecyclerView.


Remplacer layoutParams était la seule solution qui m'a aidé. Quelqu'un sait s'il s'agit d'un bogue dans RecyclerView? Serait reconnaissant pour un lien vers Google Bug Tracker.
soshial

5

essayez ceci lorsque vous définissez les paramètres de mise en page de votre élément dans l'adaptateur.

 View viewHolder= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, parent, false);
 viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
 ViewOffersHolder viewOffersHolder = new ViewOffersHolder(viewHolder);
 return viewOffersHolder;

5

J'avais fait réparer comme ça. Dans mon cas, problème avec le fichier de mise en page d'activité car j'utilise ConstraintLayout comme mise en page d'activité racine.Peut-être aussi pour vous.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolBar"
        layout="@layout/toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/accent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolBar" />
</android.support.constraint.ConstraintLayout>

2
C'est difficile à croire, mais le simple remplacement de mon ConstraintLayout environnant par un LinearLayout a résolu cela pour moi aussi ...
fjc

match_parent ne doit pas être utilisé pour les enfants directs de ConstraintLayout. À la place, utilisez 0dp avec les attributs constraintLeft / Right / Bottom / Top.
DoruAdryan

3

Dans mon cas, le problème était dans la RecyclerViewdéclaration XML, le layout_widthwas 0dp ce qui signifie match_constraints, quand je l'ai changé en match_parent, les éléments ont commencé à remplir toute la RecyclerViewlargeur:

<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="0dp"  <-- changed this to "match_parent"
            android:layout_height="0dp"
            android:layout_marginBottom="45dp"
            android:background="@android:color/transparent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHeight_default="wrap"
            app:layout_constraintHeight_max="360dp"
            app:layout_constraintHeight_min="60dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/header"/>

2

J'ai résolu cela avec:

 myInflatedRowLayout.getLayoutParams().width = vg.getWidth();

Il remplace le MATCH_PARENTpar la largeur réelle du RecyclerView.


1

Cela a fonctionné pour moi.

remplacer ceci

   View view = View.inflate(parent.getContext(), R.layout.row_timeline, null);
   return new TimeLineViewHolder(view, viewType);

par ça

 View rootView = LayoutInflater.from(context).inflate(R.layout.row_timeline, null, false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        rootView.setLayoutParams(lp);
        return new TimeLineViewHolder(rootView, viewType);

0

Vous ne pouvez pas voir votre code complet, mais je peux deviner que certaines des vues à l'intérieur de votre LinearLayout sont ' wrap_content'. Vous devez faire en sorte que l'un ou plusieurs d'entre eux s'étendent sur toute la largeur en utilisant ' android:layout_weight="1"'

mise à jour: vous avez beaucoup de redondants layout_weight. Faites-les tous ' wrap_content' et pour un seul d'entre eux ajoutez layout_weight=1- pour le dernier CustomTextView. De cette façon, il occupera tout l'espace vide.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.