Die Breite von match_parent funktioniert in RecyclerView nicht


134

Meine RecyclerView und mein Element haben die Breite match_parent, aber das Ergebnis ist: Geben Sie hier die Bildbeschreibung ein

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

und Gegenstände:

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

voll:

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

Antworten:


432

Ist in Ihrem Adapter, in dem Sie den Artikel aufblasen onCreateViewHolder, der zweite Parameter des inflateAnrufs null?

Wenn ja, ändern Sie es in parentden ersten Parameter in der onCreateViewHolderFunktionssignatur.

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

Wenn Sie den zweiten Parameter benötigen null, gehen Sie wie folgt vor, wenn Sie die Ansichtsreferenz zum Aufblasen erhalten

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
Funktioniert bei mir nicht: Wenn ich meine rootView des Elements auf width = "match_parent" setze, aber "funktioniert", wenn ich es zum Beispiel auf 500dp setze. Irgendeine Idee ? OK, es funktioniert nicht mit einem LinearLayout, sondern mit einem RelativeLayout für das Element ... wtf?
Cocorico

5
Sry, da es mit relativeLayout funktioniert, ändere ich LinearLayout einfach in RelativeLayout. Aber RecyclerView war match_parent und item rootView (also das LinearLayout) war auch Match_parent und es funktionierte nicht. Zum ersten Mal habe ich mich dem gestellt.
Cocorico

1
Oh toll, das funktioniert ... nachdem ich eine Stunde lang an meinen Haaren gezogen habe.
Zhi Kai

4
Ja, wie bereits erwähnt, funktionierte dies aus irgendeinem Grund nicht mit einem LinearLayout, und das Umschalten auf ein RelativeLayout mit diesem Fix schien den Trick zu tun.
Nick Peppers

11
Dies funktioniert nicht mit Linearlayout oder Constrainlayout. Ich musste zu Relativelayout wechseln und dann funktionierte es
ymerdrengene

18

Innerhalb der onCreateViewHolder (...) -Methode des Adapters, in dem Sie die Ansicht aufblasen, müssen Sie die ViewGroup als übergeordnetes Element definieren. Dies erhalten Sie aus dem ersten Parameter der onCreateViewHolder (...) -Methode.

siehe die folgende Zeile im zweiten Parameter Ich übergebe die ViewGroup. Dadurch wird die Ansicht automatisch dem übergeordneten Element zugeordnet:

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

/// Der vollständige Code ist unten

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

Ich habe ein FrameLayoutwith MATCH_PARENTfür width verwendet und habe das gleiche Verhalten mit einem RecyclerView+ gesehen LinearLayoutManager. Keine der oben genannten Änderungen hat bei mir funktioniert, bis ich im onCreateViewHolderRückruf Folgendes getan habe :

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

Sieht eindeutig wie ein Fehler in der RecyclerView-Implementierung aus (ich vermute).


Das Überschreiben von layoutParams war die einzige Lösung, die mir geholfen hat. Weiß jemand, ob dies ein Fehler in RecyclerView ist? Wäre dankbar für einen Link zum Google Bug Tracker.
Soshial

5

Versuchen Sie dies, wenn Sie Layoutparameter für Ihr Element im Adapter festlegen.

 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

Ich hatte so etwas repariert. In meinem Fall Problem mit der Aktivitätslayoutdatei, da ich ConstraintLayout als Stammaktivitätslayout verwende. Könnte auch für Sie der Fall sein.

<?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
Es ist kaum zu glauben, aber nur mein umgebendes ConstraintLayout durch ein LinearLayout zu ersetzen, löste dies auch für mich ...
fjc

match_parent sollte nicht für direkte untergeordnete Elemente von ConstraintLayout verwendet werden. Verwenden Sie stattdessen 0dp mit den Attributen ConstraintLeft / Right / Bottom / Top.
DoruAdryan

3

In meinem Fall lag das Problem in der RecyclerViewXML-Deklaration layout_width0dp, was bedeutet, dass match_constraints beim Ändern in match_parentElemente die gesamte RecyclerViewBreite ausfüllten :

<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

Ich habe das gelöst mit:

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

Es ersetzt das MATCH_PARENTdurch die tatsächliche Breite des RecyclerView.


1

Das hat bei mir funktioniert.

Ersetzen Sie diese

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

dadurch

 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

Ich kann Ihren vollständigen Code nicht sehen, kann aber vermuten, dass einige der Ansichten in Ihrem LinearLayout ' wrap_content' sind. Sie müssen einen oder einige von ihnen mithilfe von ' android:layout_weight="1"' auf die volle Breite erweitern.

Update: Sie haben viele redundante layout_weight. Machen Sie sie alle ' wrap_content' und fügen Sie für nur einen von ihnen hinzu layout_weight=1- für die letzte CustomTextView. Auf diese Weise wird der gesamte Leerraum belegt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.