113

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?

|
274

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.

|
  • 1

    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

    – Trịnh Mỹ Dung 15:48:31 18/06/2015
  • 1

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

    – Đỗ Uyên Thy 02:14:59 10/09/2015
  • 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.

    – Tạ Tuyết Vy 10:00:46 07/10/2015
  • 1

    Tôi nghĩ cách hiểu chính xác 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ó?

    – Ngô Hoài Hương 06:14:25 11/11/2016
  • 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); }

    – Hồ Huy Tường 02:12:10 25/05/2017
53

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>
|
  • 1

    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 đính kèm với root, nhưng cung cấp cho cha mẹ). Bạn phải làm cả RelativeLayout + không đính kèm cha mẹ, nhưng cung cấp một cái.

    – Trịnh Mỹ Dung 20:14:16 18/05/2016
  • 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?

    – Đỗ Uyên Thy 02:14:43 03/06/2016
  • 1

    Nó đã làm việc. Lời giải thích là gì ??

    – Tạ Tuyết Vy 11:33:50 05/10/2016
  • 1

    Điều này không làm việc cho tôi! Cảm ơn

    – Ngô Hoài Hương 22:24:24 07/02/2019
  • 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!

    – Hồ Huy Tường 06:31:25 08/04/2019
11

Đ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ẻ.

|
5

Điều này dường như được cố định trong 'com.android.support:recyclerview-v7:23.2.1'

Xem: RecyclerView quấn_content để thảo luận thêm.

|
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
));
|
  • 1

    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.

    – Vũ Trúc Ly 12:53:52 29/09/2017
3

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

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.