CardView layout_creen = hung match_parent 'không khớp với chiều rộng RecyclerView gốc


123

Tôi có một đoạn có chứa RecyclerView với layout_creen = "match_parent":

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$PlaceholderFragment" />

Mục trong RecyclerView là CardView cũng có layout_creen = "match_parent":

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="20dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:layout_gravity="center"
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent"
        android:textAppearance="?android:textAppearanceLarge"/>
</android.support.v7.widget.CardView>

Tôi thổi phồng khung nhìn như sau:

public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        CardView v = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_listitem, null, true);

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

Nhưng khi tôi chạy ứng dụng, CardView được hiển thị dưới dạng quấn_content như hiển thị bên dưới:

ThẻBug

Lưu ý rằng điều này đã được chạy trên trình giả lập, không phải là một thiết bị thực sự.

Tôi đang làm gì đó sai, hay đó là một lỗi?


Khi thổi phồng CardView, bạn có cung cấp chế độ xem chính với tham số đúng không?
nhaarman

Xin chào @NiekHaarman, vui lòng xem chỉnh sửa. Tôi đã thêm mã lạm phát. Và vâng tôi đã thông qua tham số thực sự.
ProgrAmmar

Câu trả lời:


291

Các tài liệu cho inflate:

Thổi phồng một hệ thống phân cấp chế độ xem mới từ tài nguyên xml được chỉ định. Ném InflateException nếu có lỗi.

ID
tài nguyên tham số cho tài nguyên bố cục XML để tải
chế độ xem gốc (ví dụ: R.layout.main_page) là cha mẹ của hệ thống phân cấp được tạo (nếu Đính kèm là đúng), hoặc đơn giản là một đối tượng cung cấp một tập hợp các giá trị LayoutParams cho gốc của hệ thống phân cấp được trả về (nếu AttachToRoot là sai.)
Đính kèmRoot Liệu hệ thống phân cấp bị thổi phồng có nên được gắn vào tham số gốc không? Nếu sai, root chỉ được sử dụng để tạo lớp con chính xác của LayoutParams cho chế độ xem gốc trong XML. Trả về Giao diện gốc của hệ thống phân cấp bị thổi phồng. Nếu root được cung cấp và AttachToRoot là đúng, thì đây là root; mặt khác, nó là gốc của tệp XML bị thổi phồng.

Điều quan trọng ở đây là không cung cấp đúng, nhưng hãy cung cấp cho cha mẹ:

LayoutInflater.from(parent.getContext())
            .inflate(R.layout.card_listitem, parent, false);

Cung cấp parentChế độ xem cho phép người truyền tải biết cách sử dụng bố cục. Việc cung cấp falsetham số cho biết nó chưa đính kèm với cha mẹ. Đó là những gì RecyclerViewsẽ làm cho bạn.


4
Giải pháp không hiệu quả với tôi vì ListView layout_widthwrap_content. Thật kỳ lạ vì điều này không ảnh hưởng đến chế độ xem danh sách! Vì vậy, sự hiểu biết của tôi là khi bạn cung cấp false làm tham số cho layoutinflater, ListView sẽ thêm các mục danh sách vào ListView với các tham số bố cục khớp với chính ListView! : 0
reubenjohn

1
bạn có thể đăng thêm một chút mã không, vì tôi nghĩ tôi đang làm như vậy, nhưng thực ra nó không hoạt động
Rodi

1
Tôi đang thổi phồng cách bạn đề xuất và match_parent không hoạt động với tôi.
Zapnologica

3
Tôi nghĩ cách hiểu đúng là khi bạn đặt Đính kèmRoot thành false, bạn cần cung cấp một đối tượng có giá trị LayoutParams đã xác định. Đối tượng đó không nhất thiết là cha mẹ. . một tham số đối tượng khác để thông báo cho nó?
hjchin

1
Nếu tôi sử dụng chế độ xem tùy chỉnh, làm thế nào để đối phó với nó? Ý tôi làViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
Kross

64

Sử dụng RelativeLayout làm cha mẹ ngay lập tức cho CardView.

<RelativeLayout 
    android:layout_width="match_parent" ... >
    <CardView 
        android:layout_width="match_parent" ... >
    </CardView>
</RelativeLayout>

Vâng, điều này dường như làm việc cho tôi là tốt. Tôi đã sử dụng linearLayout và đề xuất ở trên không hoạt động vì tôi đã thực hiện chính xác điều đó (tức là không gắn vào root, nhưng cung cấp cho cha mẹ). Bạn phải thực hiện cả RelativeLayout + không đính kèm cha mẹ, nhưng cung cấp một.
chubbsondub

1
Nó hoạt động với tôi, nhưng tôi không biết tại sao điều này có thể giải quyết vấn đề. Có ai có thể giải thích tại sao không?
Johnny

1
Nó đã có từ lâu, android x đang được sản xuất, nhưng lỗi vẫn chưa được sửa!
Muhammad Naderi

cách dễ nhất.
Abdurahman Popal

Tôi đã có một vấn đề tương tự và điều này đã giúp tôi khắc phục độ rộng của chế độ xem thẻ nhưng tôi đang gặp vấn đề tương tự với chiều cao? Bạn có thể đề nghị tôi một cái gì đó cho điều đó là tốt?

12

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

 View viewHolder= LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item, null, false);
 viewHolder.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
 return new ViewOffersHolder(viewHolder);

6

Cách tôi đã làm là:

View view = mInflater.inflate(R.layout.row_cardview, null, true);
            WindowManager windowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
            int width = windowManager.getDefaultDisplay().getWidth();
            view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT));

Giải thích: Trong onCreateViewHolde của bạn một khi bạn có chế độ xem thẻ, lấy chiều rộng màn hình và sau đó đặt tham số bố cục phù hợp cho chế độ xem thẻ.


1
xin vui lòng cải thiện điều này một chút. Về cơ bản nó nói "Hãy thử cái này"
vẽ

Đã thêm Giải thích. Vui lòng kiểm tra và nếu cần thêm trợ giúp, bình luận ở đây.
Rulul


4

Đơn giản chỉ cần đặt tham số bố cục mới

view.setLayoutParams(new RecyclerView.LayoutParams(
    RecyclerView.LayoutParams.MATCH_PARENT,
    RecyclerView.LayoutParams.WRAP_CONTENT
));

Tôi thấy làm điều này trong onBindViewHolder () hữu ích khi sử dụng lớp chế độ xem tùy chỉnh kế thừa từ ConstraintLayout.
Rasmusob

Đó không phải là một câu trả lời hay vì lề được đặt thành bố cục sẽ bị ảnh hưởng.
Emi Raz

4

Việc triển khai mặc định buộc sử dụng quấn_content trong trình quản lý bố cục mặc định:

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

Tất cả bạn phải làm là ghi đè phương thức này trong Trình quản lý bố cục của bạn như thế này:

  @Override
public LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
}

2

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

View view = inflator.inflate(R.layout.layout_item, ***null***, false);

1

Sử dụng card_view: contentPadding với giá trị âm

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    card_view:contentPadding="-4dp"
    card_view:cardElevation="0dp"
    android:layout_height="wrap_content">

Nó làm việc cho tôi


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.