match_parent width non funziona in RecyclerView


135

Il mio RecyclerView e l'oggetto hanno larghezza match_parent ma il risultato è: inserisci qui la descrizione dell'immagine

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

e articoli:

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

pieno:

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

Risposte:


433

Nell'adattatore in cui si sta gonfiando l'elemento onCreateViewHolder, è il secondo parametro della inflatechiamata null?

In tal caso, cambiarlo in parentquale è il primo parametro nella onCreateViewHolderfirma della funzione.

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

Se è necessario che il secondo parametro sia nullquando si ottiene il riferimento della vista al gonfiaggio, procedere come segue

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
Non funziona per me: se imposto il mio rootView dell'articolo su width = "match_parent" ma "funziona" se lo imposto su 500dp, ad esempio. Qualche idea ? OK, non funziona con un LinearLayout ma funziona con un relative Layout sull'elemento ... wtf?
Cocorico,

5
Sry, Come funziona con relativeLayout, cambio semplicemente LinearLayout in RelativeLayout. Ma RecyclerView era match_parent e l'elemento rootView (quindi LinearLayout) era anche Match_parent e non funzionava. La prima volta che ho affrontato questo.
Cocorico,

1
Oh fantastico, funziona ... dopo avermi tirato i capelli per un'ora.
Zhi Kai,

4
Sì, come accennato in precedenza per qualche motivo, questo non ha funzionato con un LinearLayout e il passaggio a un RelativeLayout con questa correzione sembrava fare il trucco.
Nick Peppers,

11
Questo non funziona con Linearlayout o Constrainlayout. Ho dovuto passare a Relativelayout e poi ha funzionato
ymerdrengene il

18

All'interno del metodo onCreateViewHolder (...) dell'adattatore in cui si sta gonfiando la vista .. è necessario definire ViewGroup come padre. Questo si otterrà dal primo parametro del metodo onCreateViewHolder (...).

vedere la riga sotto nel secondo parametro che sto passando il ViewGroup. Questo abbinerà automaticamente la vista al suo genitore:

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

/// il codice completo è sotto

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

Stavo usando un FrameLayoutcon MATCH_PARENTper larghezza e vedevo lo stesso comportamento con un RecyclerView+ LinearLayoutManager. Nessuna delle modifiche sopra ha funzionato per me fino a quando non ho effettuato le seguenti operazioni nel onCreateViewHoldercallback:

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

Chiaramente sembra un bug nell'implementazione di RecyclerView (suppongo).


Override layoutParams è stata l'unica soluzione che mi ha aiutato. Qualcuno sa se questo è un bug in RecyclerView? Sarei grato per un link al bug tracker di Google.
soshial,

5

provalo quando imposti i parametri di layout per il tuo articolo nell'adattatore.

 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

Avevo risolto in questo modo. Nel mio caso problema con il file di layout attività perché sto usando ConstraintLayout come layout attività radice. Potrebbe essere il caso anche per te.

<?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
È difficile da credere, ma la semplice sostituzione del mio vincolo di vincolo circostante con un LinearLayout ha risolto anche questo per me ...
fjc

match_parent non deve essere usato per i figli diretti di ConstraintLayout. Utilizzare invece 0dp con gli attributi vincoloLeft / Right / Bottom / Top.
DoruAdryan il

3

Nel mio caso, il problema era nella RecyclerViewdichiarazione XML, layout_widthera 0dp che significa match_constraints, quando l'ho cambiato in match_parent, gli elementi hanno iniziato a riempire tutta la RecyclerViewlarghezza:

<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

Ho risolto questo con:

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

Sostituisce il MATCH_PARENTcon la larghezza effettiva del file RecyclerView.


1

Questo ha funzionato per me.

sostituire questo

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

da questo

 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

Non riesco a vedere il tuo codice completo, ma posso indovinare che alcune delle viste all'interno di LinearLayout sono ' wrap_content'. Devi fare in modo che uno o alcuni di essi si espandano a tutta larghezza usando ' android:layout_weight="1"'

aggiornamento: hai molti ridondanti layout_weight. Renderli tutti ' wrap_content' e per uno solo di essi aggiungere layout_weight=1- per l'ultimo CustomTextView. In questo modo, occuperà tutto lo spazio vuoto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.