web-dev-qa-db-fra.com

match_parent width ne fonctionne pas dans RecyclerView

Mon objet RecyclerView et mon objet ont la largeur match_parent, mais le résultat est le suivant: enter image description here

    <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>
104
ArMo 372

Dans votre adaptateur où vous gonflez l'élément dans onCreateViewHolder, le deuxième paramètre de l'appel inflate appelle-t-il null ?.

Si c'est le cas, remplacez-le par parent, qui est le premier paramètre de la signature de fonction onCreateViewHolder.

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

Si vous avez besoin que le second paramètre soit null, puis, lorsque vous obtenez la référence de vue lors du 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);
337
prats110892

Dans la méthode onCreateViewHolder (...) de l'adaptateur où vous gonflez la vue .. vous devez définir le ViewGroup en tant que parent. Vous obtiendrez ainsi le premier 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 en 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);
17
HAXM

essayez ceci lorsque vous définissez les paramètres de disposition pour votre article 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
Zahra.HY

J'avais fait réparer comme ça. Dans mon cas, le problème avec le fichier de mise en page d'activité parce que j'utilise ConstraintLayout en tant que mise en page d'activité principale.

<?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>
4
Pankaj Kant Patel

J'utilisais un FrameLayout avec MATCH_PARENT pour la largeur et je 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 rappel onCreateViewHolder:

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

Cela ressemble clairement à un bug (je suppose) de la mise en œuvre de RecyclerView.

4
scorpiodawg

J'ai résolu ceci avec:

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

Il remplace le MATCH_PARENT par la largeur réelle du RecyclerView.

3
Amir Uval

Dans mon cas, le problème était dans la déclaration RecyclerView XML, le layout_width était égal à 0dp, ce qui signifie que les contraintes de correspondance, quand je l'ai changé en match_parrent les éléments ont commencé à remplir tout RecyclerView width :

<androidx.recyclerview.widget.RecyclerView
            Android:id="@+id/recyclerView"
            Android:layout_width="0dp"  <-- changed this to "match_parrent"
            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"/>
1
Lemberg

Cela a fonctionné pour moi.

remplacez 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
Momen Zaqout

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

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

0
khusrav