match_parent genişliği RecyclerView'da çalışmıyor


136

RecyclerView ve öğem match_parent genişliğine sahip ancak sonuç şu şekilde: görüntü açıklamasını buraya girin

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

ve öğeler:

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

tam:

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

Yanıtlar:


434

Öğeyi şişirdiğiniz adaptörünüzde onCreateViewHolder, inflateçağrının ikinci parametresi nullmi?

Eğer öyleyse parent, onCreateViewHolderişlev imzasındaki ilk parametrenin hangisi olduğunu değiştirin .

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

İkinci parametrenin olması gerekiyorsa null, şişirme ile ilgili görünüm referansını aldığınızda aşağıdakileri yapın

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
Benim için çalışmıyor: Öğenin rootView'ını width = "match_parent" olarak ayarlarsam, ancak örneğin 500dp olarak ayarlarsam "çalışır". Herhangi bir fikir ? Tamam, bir LinearLayout ile çalışmıyor, ancak öğe üzerinde bir relativeLayout ile çalışıyor ... wtf?
Cocorico

5
Sry, relativeLayout ile çalıştığı için, LinearLayout'u RelativeLayout olarak değiştiriyorum. Ancak RecyclerView match_parent idi ve item rootView (yani LinearLayout) da Match_parent idi ve işe yaramadı. Bununla ilk karşılaştığımda.
Cocorico

1
Oh harika, bu işe yarıyor ... bir saat saçımı çektikten sonra.
Zhi Kai

4
Evet, daha önce de belirtildiği gibi, bir sebepten dolayı bu bir LinearLayout ile çalışmadı ve bu düzeltmeyle onu RelativeLayout'a geçirmek işe yarayacak gibi görünüyordu.
Nick Peppers

11
Bu, Linearlayout veya Constrainlayout ile çalışmaz. Relativelayout'a geçmek zorunda kaldım ve sonra çalıştı
ymerdrengene

18

Görünümü şişirdiğiniz adaptörün onCreateViewHolder (...) metodunun içinde .. ViewGroup'u ebeveyn olarak tanımlamalısınız. OnCreateViewHolder (...) metodunun 1. parametresinden alacaksınız.

İkinci parametrede aşağıdaki satıra bakın, ViewGroup'u geçiyorum. Bu, görünümü otomatik olarak üst öğesiyle eşleştirir:

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

/// kodun tamamı aşağıdadır

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

Bir kullanıyordu FrameLayoutile MATCH_PARENTgenişliği ve aynı davranışı gördüğünü RecyclerView+ LinearLayoutManager. onCreateViewHolderGeri aramada aşağıdakileri yapana kadar yukarıdaki değişikliklerin hiçbiri benim için işe yaramadı :

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

Açıkça RecyclerView uygulamasında (tahmin ediyorum) bir hata gibi görünüyor.


Düzen Params bana yardımcı olan tek çözümdü. Bunun RecyclerView'da bir hata olup olmadığını bilen var mı? Google hata izleyiciye bir bağlantı için minnettar olurum.
soshial

5

Bağdaştırıcıdaki öğeniz için düzen parametreleri ayarladığınızda bunu deneyin.

 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

Böyle bir düzeltme yapmıştım. Benim durumumda etkinlik düzeni dosyasıyla ilgili sorunumda, çünkü ConstraintLayout'u kök etkinlik düzeni olarak kullanıyorum. Sizin için de durum olabilir.

<?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
İnanması zor, ama çevreleyen ConstraintLayout'u bir LinearLayout ile değiştirmek bunu benim için de çözdü ...
fjc

match_parent, ConstraintLayout'un doğrudan çocukları için kullanılmamalıdır. Bunun yerine, constraintLeft / Right / Bottom / Top nitelikleriyle 0dp kullanın.
DoruAdryan

3

Benim durumumda, sorun RecyclerViewXML bildirimindeydi, layout_width0dp idi , bu da match_constraints anlamına geliyor, olarak değiştirdiğimde match_parentöğeler tüm RecyclerViewgenişliği doldurmaya başladı :

<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

Bunu şununla çözdüm:

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

MATCH_PARENTGerçek genişliğiyle değiştiriliyor RecyclerView.


1

Bu benim için çalıştı.

bunu değiştir

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

bundan

 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

Tam kodunuzu göremiyorum, ancak LinearLayout'unuzun içindeki bazı görünümlerin olduğunu tahmin edebilirim ' wrap_content'. Kullanarak bunlardan birini veya bir kısmını tam genişliğe genişletmeniz gerekiyor ' android:layout_weight="1"'

güncelleme: çok sayıda fazlalık var layout_weight. Hepsini yapın ' wrap_content' ve bunlardan yalnızca biri layout_weight=1için - son CustomTextView için ekleyin . Bu şekilde, tüm boş alanı kaplayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.