el ancho de match_parent no funciona en RecyclerView

135

Mi RecyclerView y el artículo tienen ancho de match_parent pero el resultado es: ingrese la descripción de la imagen aquí

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

y artículos:

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

completo:

<?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>
abbasalim
fuente

Respuestas:

433

En su adaptador donde está inflando el elemento onCreateViewHolder, ¿es el segundo parámetro de la inflatellamada null?

Si es así, cámbielo a parentcuál es el primer parámetro en la onCreateViewHolderfirma de la función.

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

Si necesita que el segundo parámetro sea null, cuando obtenga la referencia de vista sobre el inflado, haga lo siguiente

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);
prats110892
fuente
1
No funciona para mí: si configuro mi rootView del elemento en width = "match_parent" pero "funciona" si lo configuro en 500dp, por ejemplo. Alguna idea ? OK, no funciona con un LinearLayout pero funciona con un relativo Layout en el elemento ... wtf?
Cocorico
55
Sry, ya que funciona con relativo diseño, solo cambio Linear diseño a Relative diseño. Pero RecyclerView era match_parent, y el elemento rootView (por lo que LinearLayout) también era Match_parent y no funcionó. La primera vez que me enfrenté a esto.
Cocorico
1
Oh genial, esto funciona ... después de tirar de mi cabello por una hora.
Zhi Kai
44
Sí, como se mencionó anteriormente por alguna razón, esto no funcionó con un LinearLayout y cambiarlo a un RelativeLayout con esta solución pareció hacer el truco.
Nick Peppers el
11
Esto no funciona con Linearlayout o Constrainlayout. Tuve que cambiar a Relativelayout y luego funcionó
ymerdrengene
18

Dentro del método onCreateViewHolder (...) del adaptador donde está inflando la vista ... debe definir ViewGroup como padre. Esto lo obtendrá del primer parámetro del método onCreateViewHolder (...).

ver la línea de abajo en el segundo parámetro estoy pasando el ViewGroup. Esto hará coincidir automáticamente la vista con su padre:

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

/// el código completo está debajo

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);
HAXM
fuente
8

Estaba usando un FrameLayoutcon MATCH_PARENTpara ancho y estaba viendo el mismo comportamiento con un RecyclerView+ LinearLayoutManager. Ninguno de los cambios anteriores funcionó para mí hasta que hice lo siguiente en la onCreateViewHolderdevolución de llamada:

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

Claramente parece un error en (supongo) la implementación de RecyclerView.

scorpiodawg
fuente
Anular layoutParams fue la única solución que me ayudó. Alguien sabe si esto es un error en RecyclerView? Agradecería un enlace al rastreador de errores de Google.
soshial
5

intente esto cuando configure los parámetros de diseño para su artículo en el adaptador.

 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;
Zahra.HY
fuente
5

Había arreglado así. En mi caso, problema con el archivo de diseño de actividad porque estoy usando ConstraintLayout como diseño de actividad raíz. También podría ser el caso para usted.

<?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>
Pankaj Kant Patel
fuente
2
Es difícil de creer, pero solo reemplazar mi ConstraintLayout circundante con un LinearLayout también me resolvió esto ...
fjc
match_parent no debe usarse para hijos directos de ConstraintLayout. En su lugar, use 0dp con los atributos restricintLeft / Right / Bottom / Top.
DoruAdryan
3

En mi caso, el problema estaba en la RecyclerViewdeclaración XML, layout_widthera 0dp, lo que significa match_constraints, cuando lo cambié a match_parent, los elementos comenzaron a llenar todo el RecyclerViewancho:

<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"/>
Roman Nazarevych
fuente
2

Resolví esto con:

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

Está reemplazando el MATCH_PARENTcon el ancho real de RecyclerView.

Amir Uval
fuente
1

Esto funcionó para mí.

reemplazar esto

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

por esto

 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);
Momen Zaqout
fuente
0

No puedo ver su código completo, pero puedo adivinar que algunas de las vistas dentro de su LinearLayout son ' wrap_content'. Debe hacer que uno o algunos de ellos se expandan al ancho completo usando ' android:layout_weight="1"'

actualización: tienes muchos redundantes layout_weight. Hazlos todos ' wrap_content' y solo uno de ellos agrega layout_weight=1, para el último CustomTextView. De esta manera, ocupará todo el espacio en blanco.

khusrav
fuente