Lebar match_parent tidak berfungsi di RecyclerView


135

RecyclerView dan item saya memiliki lebar match_parent tetapi hasilnya adalah: masukkan deskripsi gambar di sini

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

dan item:

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

penuh:

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

Jawaban:


433

Di adaptor Anda tempat Anda menggembungkan item onCreateViewHolder, apakah parameter inflatepanggilan kedua null?

Jika demikian ubah ke parentyang merupakan parameter pertama dalam onCreateViewHoldertanda tangan fungsi.

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

Jika Anda membutuhkan parameter kedua, nullmaka ketika Anda mendapatkan referensi tampilan tentang penggelembungan, lakukan hal berikut

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
Tidak berfungsi untuk saya: jika saya mengatur rootView saya dari item ke width = "match_parent" tetapi "berfungsi" jika saya mengaturnya ke 500dp misalnya. Ada ide ? OK, itu tidak bekerja dengan LinearLayout tetapi bekerja dengan relatifLayout pada item ... wtf?
Cocorico

5
Sry, Karena berfungsi dengan relatifLayout, saya hanya mengubah LinearLayout ke RelativeLayout. Tapi RecyclerView adalah match_parent, dan item rootView (jadi LinearLayout) juga Match_parent dan tidak berfungsi. Pertama kali saya menghadapi ini.
Cocorico

1
Oh bagus, ini berhasil..setelah mencabut rambut saya selama satu jam.
Zhi Kai

4
Ya seperti yang disebutkan sebelumnya karena beberapa alasan ini tidak bekerja dengan LinearLayout dan mengubahnya ke RelativeLayout dengan perbaikan ini sepertinya melakukan trik.
Nick Peppers

11
Ini tidak berfungsi dengan Linearlayout atau Constrainlayout. Saya harus beralih ke Relativelayout dan kemudian bekerja
ymerdrengene

18

Di dalam metode onCreateViewHolder (...) di mana Anda menggembungkan tampilan .. Anda harus mendefinisikan ViewGroup sebagai induknya. Ini akan Anda dapatkan dari parameter pertama metode onCreateViewHolder (...).

lihat baris di bawah ini pada parameter kedua saya melewati ViewGroup. Ini akan secara otomatis mencocokkan tampilan dengan induknya:

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

/// kode lengkapnya ada di bawah ini

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

Saya menggunakan FrameLayoutdengan MATCH_PARENTuntuk lebar dan melihat perilaku yang sama dengan RecyclerView+ LinearLayoutManager. Tidak satu pun dari perubahan di atas yang berfungsi untuk saya hingga saya melakukan hal berikut di 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);
}

Jelas terlihat seperti bug dalam (saya menduga) implementasi RecyclerView.


Layout layoutParams adalah satu-satunya solusi yang membantu saya. Adakah yang tahu apakah ini bug di RecyclerView? Akan berterima kasih atas tautan ke pelacak bug Google.
soshial

5

coba ini ketika Anda mengatur tata letak params untuk item Anda di adaptor.

 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

Saya telah melakukan perbaikan seperti ini. Dalam kasus saya masalah dengan file tata letak aktivitas karena saya menggunakan ConstraintLayout sebagai tata letak aktivitas root. Mungkin juga untuk Anda.

<?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
Sulit dipercaya, tetapi hanya mengganti ConstraintLayout di sekitarku dengan LinearLayout yang memecahkan masalah ini untukku juga ...
fjc

match_parent tidak boleh digunakan untuk anak-anak langsung dari ConstraintLayout. Sebagai gantinya, gunakan 0dp dengan atribut constraintLeft / Kanan / Bawah / Top.
DoruAdryan

3

Dalam kasus saya, masalahnya adalah dalam RecyclerViewdeklarasi XML, layout_widthadalah 0dp yang berarti match_constraints, ketika saya mengubahnya match_parent, item mulai mengisi semua RecyclerViewlebar:

<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

Saya memecahkan ini dengan:

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

Ini mengganti MATCH_PARENTdengan lebar aktual dari RecyclerView.


1

Ini berhasil untuk saya.

ganti ini

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

dengan ini

 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

Tidak dapat melihat kode lengkap Anda, tetapi dapat menebak, bahwa beberapa tampilan di dalam LinearLayout Anda adalah ' wrap_content'. Anda perlu membuat satu atau beberapa dari mereka meluas ke lebar penuh dengan menggunakan ' android:layout_weight="1"'

pembaruan: Anda memiliki banyak cadangan layout_weight. Buat semuanya ' wrap_content' dan hanya satu yang ditambahkan layout_weight=1- untuk CustomTextView terakhir. Dengan cara ini, ia akan menempati semua ruang kosong.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.