CardView layout_width =“match_parent”가 상위 RecyclerView 너비와 일치하지 않습니다.


123

나는 layout_width = "match_parent"와 함께 RecyclerView를 포함하는 조각이 있습니다.

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

RecyclerView의 항목은 layout_width = "match_parent"도있는 CardView입니다.

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

다음과 같이 항목보기를 부풀립니다.

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

하지만 앱을 실행할 때 CardView는 아래와 같이 wrap_content로 렌더링됩니다.

카드 버그

이것은 실제 장치가 아닌 에뮬레이터에서 실행되었습니다.

내가 뭘 잘못하고 있습니까? 아니면 버그입니까?


CardView를 확장 할 때 실제 매개 변수로 상위보기를 제공합니까?
nhaarman

안녕하세요 @NiekHaarman, 편집을 참조하십시오. 팽창 코드를 추가했습니다. 그리고 네, 진정한 매개 변수를 전달했습니다.
ProgrAmmar

답변:


291

에 대한 문서 inflate:

지정된 xml 리소스에서 새보기 계층을 확장합니다. 오류가있는 경우 InflateException이 발생합니다.

로드 할 XML 레이아웃 리소스의 매개 변수
리소스 ID (예 : R.layout.main_page) 루트
가 생성 된 계층의 부모 (attachToRoot가 true 인 경우) 또는 단순히 루트에 대한 LayoutParams 값 집합을 제공하는 객체가됩니다. 반환 된 계층 구조 (attachToRoot가 false 인 경우)
attachToRoot 부풀려진 계층 구조가 루트 매개 변수에 첨부되어야하는지 여부? false 인 경우 루트는 XML의 루트 뷰에 대한 LayoutParams의 올바른 하위 클래스를 만드는 데만 사용됩니다. 부풀려진 계층 구조의 루트 뷰를 반환합니다. root가 제공되고 attachToRoot가 true이면 이것은 root입니다. 그렇지 않으면 확장 된 XML 파일의 루트입니다.

여기에 중요 하지 진정한 제공하지만 않는 부모를 공급 :

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

공급 parent보기 것은 사용의 LayoutParams 무엇 인플레이터의 노하우를 할 수 있습니다. false매개 변수를 제공하면 아직 부모에 연결 하지 않도록 지시합니다 . 그것이 RecyclerView당신을 위해 할 일입니다.


4
이 솔루션은 ListView layout_widthwrap_content. 이것은 목록보기에 영향을주지 않기 때문에 이상합니다! 그래서 내 이해는 layoutinflater에 매개 변수로 false를 제공하면 ListView가 ListView 자체와 일치하는 레이아웃 매개 변수로 ListView에 목록 항목을 추가한다는 것입니다! : 0
reubenjohn 2015-06-18

1
내가 같은 일을 해요 생각하지만, 실제로는 작동하지 않기 때문에 당신은 좀 더 코드를 게시 할 수
로디

1
나는 당신의 제안과 match_parent가 나를 위해 작동하지 않는 방식을 부풀리고 있습니다.
Zapnologica

3
정확한 이해는 attachToRoot를 false로 설정하면 정의 된 LayoutParams 값으로 개체를 제공해야한다는 것입니다. 해당 개체는 반드시 부모가 아닙니다. "... 반환 된 계층 구조의 루트에 대한 LayoutParams 값 집합을 제공하는 개체 (attachToRoot가 false 인 경우) ..."하지만 인플레이터가 CardView에 정의 된 LayoutParams를 읽을 수 없지만 필요한 이유를 이해할 수 없습니다. 그것을 알리는 다른 개체 매개 변수?
hjchin

1
사용자 정의보기를 사용하는 경우 어떻게 처리합니까? 내 말은ViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
Kross

65

RelativeLayout을 CardView의 직계 부모로 사용합니다.

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

예, 이것은 저에게도 효과가있는 것 같습니다. 나는 LinearLayout을 사용하고 있었고 위의 제안은 이미 정확히 수행하고 있었기 때문에 작동하지 않았습니다 (즉, 루트에 연결하지 않고 부모를 제공). RelativeLayout + 부모를 연결하지 않고 하나를 제공해야합니다.
chubbsondubs

1
그것은 나를 위해 작동하지만 이것이 왜 문제를 해결할 수 있는지 모르겠습니다. 누구든지 이유를 설명 할 수 있습니까?
조니

1
그것은 오래되었고, 안드로이드 x는 생산 중이지만 여전히 버그는 수정되지 않았습니다!
Muhammad Naderi

가장 쉬운 방법입니다.
Abdurahman Popal

비슷한 문제가 있었는데 카드보기의 너비를 수정하는 데 도움이되었지만 높이에 비슷한 문제가 있습니까? 그것에 대해 나에게도 제안 할 수 있습니까?

12

이것은 나를 위해 일했습니다.

 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

내가 한 방법은 다음과 같습니다.

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

설명 : onCreateViewHolde에서 카드보기가 표시되면 화면 너비를 가져온 다음 카드보기에 맞게 레이아웃 매개 변수를 설정하십시오.


1
이것을 약간 개선하십시오. 그것은 기본적으로 "이 시도"라고
드류

설명이 추가되었습니다. 확인하고 추가 도움이 필요하면 여기에 의견을 남겨주세요.
Rahul


4

새 레이아웃 매개 변수를 설정하기 만하면됩니다.

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

ConstraintLayout에서 상속하는 사용자 정의 뷰 클래스를 사용할 때 onBindViewHolder ()에서이 작업을 수행하는 것이 유용하다는 것을 알았습니다.
Rasmusob

레이아웃에 설정된 여백이 영향을 받기 때문에 좋은 대답이 아닙니다.
Emi Raz

4

기본 구현 은 기본 레이아웃 관리자에서 wrap_content 사용을 강제합니다 .

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

다음과 같이 LayoutManager에서이 메서드를 재정의하기 만하면됩니다.

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

2

이것은 나를 위해 작동합니다

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

1

음수 값으로 card_view : contentPadding 사용

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

그것은 나를 위해 일했습니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.