나는 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로 렌더링됩니다.
이것은 실제 장치가 아닌 에뮬레이터에서 실행되었습니다.
내가 뭘 잘못하고 있습니까? 아니면 버그입니까?
답변
에 대한 문서 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
당신을 위해 할 일입니다.
답변
RelativeLayout을 CardView의 직계 부모로 사용합니다.
<RelativeLayout
android:layout_width="match_parent" ... >
<CardView
android:layout_width="match_parent" ... >
</CardView>
</RelativeLayout>
답변
이것은 나를 위해 일했습니다.
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);
답변
내가 한 방법은 다음과 같습니다.
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에서 카드보기가 표시되면 화면 너비를 가져온 다음 카드보기에 맞게 레이아웃 매개 변수를 설정하십시오.
답변
이것은 수정 된 것으로 보입니다 'com.android.support:recyclerview-v7:23.2.1'
자세한 내용은 RecyclerView wrap_content 를 참조하세요 .
답변
새 레이아웃 매개 변수를 설정하기 만하면됩니다.
view.setLayoutParams(new RecyclerView.LayoutParams(
RecyclerView.LayoutParams.MATCH_PARENT,
RecyclerView.LayoutParams.WRAP_CONTENT
));
답변
기본 구현 은 기본 레이아웃 관리자에서 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);
}