match_parent width không hoạt động trong RecyclerView


134

RecyclerView và mục của tôi có chiều rộng match_parent nhưng kết quả là: nhập mô tả hình ảnh ở đây

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

và các mặt hàng:

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

đầy:

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

Câu trả lời:


432

Trong bộ chuyển đổi của bạn nơi bạn đang bơm mục đó vào onCreateViewHolder, tham số thứ hai của inflatecuộc gọi null?.

Nếu vậy, thay đổi nó thành parenttham số đầu tiên trong onCreateViewHolderchữ ký hàm.

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

Nếu bạn cần tham số thứ hai nullthì khi bạn có được tham chiếu khung nhìn về lạm phát, hãy làm như sau

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
Nó không hoạt động với tôi: nếu tôi đặt rootView của mục thành width = "match_parent" nhưng nó "hoạt động" nếu tôi đặt nó thành 500dp chẳng hạn. Bất kỳ ý tưởng ? OK, nó không hoạt động với linearLayout nhưng hoạt động với tương đốiLayout trên mục ... wtf?
Cocorico

5
Sry, vì nó hoạt động với RelLayout, tôi chỉ thay đổi linearLayout thành RelativeLayout. Nhưng RecyclerView là match_parent và mục rootView (vì vậy, linearLayout) cũng là Match_parent và nó không hoạt động. Lần đầu tiên tôi phải đối mặt với điều này.
Cocorico

1
Ôi thật tuyệt, cái này hoạt động..sau khi kéo tóc tôi một tiếng.
Zi Kai

4
Vâng, như đã đề cập trước đây vì một số lý do, điều này không hoạt động với linearLayout và chuyển nó thành RelativeLayout với cách khắc phục này dường như là một mẹo nhỏ.
Nick Peppers

11
Điều này không hoạt động với Linearlayout hoặc Constrainlayout. Tôi đã phải chuyển sang
Relat khóaayout

18

Bên trong phương thức bộ điều hợp onCreateViewHolder (...) nơi bạn đang tăng cường xem .. bạn phải xác định Viewgroup là cha mẹ. Điều này bạn sẽ nhận được từ tham số đầu tiên của phương thức onCreateViewHolder (...).

xem dòng dưới đây trong tham số thứ hai tôi đang vượt qua Viewgroup. Điều này sẽ tự động khớp khung nhìn với cha của nó:

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

/// mã hoàn chỉnh bên dưới

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

Tôi đã sử dụng a FrameLayoutvới MATCH_PARENTchiều rộng và thấy hành vi tương tự với dấu RecyclerView+ LinearLayoutManager. Không có thay đổi nào ở trên làm việc cho tôi cho đến khi tôi thực hiện các thao tác sau trong cuộc onCreateViewHoldergọi lại:

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

Rõ ràng trông giống như một lỗi trong (tôi đoán) việc triển khai RecyclerView.


Ghi đè layoutParams là giải pháp duy nhất giúp tôi. Bất cứ ai cũng biết nếu đây là một lỗi trong RecyclerView? Sẽ rất biết ơn cho một liên kết đến Google theo dõi lỗi.
soshial

5

hãy thử điều này khi bạn đặt thông số bố trí cho mục của bạn trong bộ điều hợp.

 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

Tôi đã thực hiện sửa chữa như thế này. Trong trường hợp của tôi có vấn đề với tệp bố cục hoạt động vì tôi đang sử dụng ConstraintLayout làm bố cục hoạt động gốc. Trường hợp này cũng phù hợp với bạn.

<?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
Thật khó tin, nhưng chỉ cần thay thế ConstraintLayout xung quanh của tôi bằng một linearLayout cũng đã giải quyết điều này cho tôi ...
fjc

match_parent không nên được sử dụng cho trẻ em trực tiếp của ConstraintLayout. Thay vào đó, sử dụng 0dp với các thuộc tính ràng buộcLeft / Right / bottom / Top.
DoruAdryan

3

Trong trường hợp của tôi, vấn đề là ở RecyclerViewkhai báo XML, layout_widthlà 0dp, có nghĩa là match_constraint, khi tôi thay đổi nó match_parent, các mục bắt đầu điền vào tất cả RecyclerViewchiều rộng:

<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

Tôi đã giải quyết điều này với:

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

Nó đang thay thế MATCH_PARENTbằng chiều rộng thực tế của RecyclerView.


1

Điều này làm việc cho tôi.

thay thế cái này

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

bằng cách này

 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

Không thể xem mã đầy đủ của bạn, nhưng có thể đoán rằng một số chế độ xem bên trong Tuyến tính của bạn là ' wrap_content'. Bạn cần làm cho một hoặc một vài trong số chúng mở rộng ra toàn bộ chiều rộng bằng cách sử dụng ' android:layout_weight="1"'

cập nhật: bạn có rất nhiều dự phòng layout_weight. Làm cho tất cả chúng ' wrap_content' và chỉ một trong số chúng thêm layout_weight=1vào - cho CustomTextView cuối cùng. Bằng cách này, nó sẽ chiếm tất cả các không gian trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.