Mam fragment zawierający RecyclerView z layout_width = "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" />
Element w RecyclerView to CardView, również z layout_width = "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>
Nadmuchuję widok przedmiotu, jak poniżej:
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;
}
Ale kiedy uruchamiam aplikację, CardView jest renderowane jako wrap_content, jak pokazano poniżej:
Zauważ, że zostało to uruchomione na emulatorze, a nie na prawdziwym urządzeniu.
Czy robię coś źle, czy to błąd?
Odpowiedzi:
Dokumenty dotyczące
inflate
:Ważne jest, aby nie dostarczać prawda, ale nie dostarczają rodzica:
Dostarczenie
parent
widoku pozwala inflaterowi wiedzieć, jakich parametrów układu użyć. Podaniefalse
parametru nakazuje mu jeszcze nie dołączać go do rodzica. To właśnieRecyclerView
zrobi dla ciebie wola.źródło
layout_width
byłwrap_content
. To dziwne, ponieważ nie powinno to wpływać na widok listy! Rozumiem więc, że gdy podasz false jako parametr do layoutinflater, ListView dodaje elementy listy do ListView z parametrami układu pasującymi do samego ListView! : 0ViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
Użyj RelativeLayout jako bezpośredniego elementu nadrzędnego CardView.
źródło
To zadziałało dla mnie,
źródło
Sposób, w jaki to zrobiłem, to:
Objaśnienie: W swoim onCreateViewHolde po uzyskaniu widoku karty pobierz szerokość ekranu, a następnie ustaw odpowiednio parametr układu dla widoku karty.
źródło
Wydaje się, że zostało to naprawione w
'com.android.support:recyclerview-v7:23.2.1'
Zobacz: RecyclerView wrap_content dla dalszych dyskusji.
źródło
Po prostu ustaw nowe parametry układu
źródło
Domyślna implementacja wymusza użycie wrap_content w domyślnym menedżerze układu:
Wszystko, co musisz zrobić, to zastąpić tę metodę w swoim LayoutManager w następujący sposób:
źródło
To działa dla mnie
źródło
Użyj card_view: contentPadding z wartością ujemną
U mnie to zadziałało
źródło
Zawijaj
CardView
w układzie o szerokości:match_parent
źródło