Eu tenho um fragmento com contém um RecyclerView com 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" />
O item no RecyclerView é um CardView também com 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>
Infle a visualização do item como abaixo:
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;
}
Mas quando executo o aplicativo, o CardView é renderizado como wrap_content, como mostrado abaixo:
Observe que isso foi executado no emulador, não em um dispositivo real.
Estou fazendo algo errado ou é um bug?
Respostas:
Os documentos para
inflate
:É importante aqui para não fornecer verdade, mas não fornecer o pai:
Fornecer a
parent
visualização permite que o inflador saiba quais parâmetros de layout usar. O fornecimento dofalse
parâmetro diz para ele ainda não o anexar ao pai. Isso é o que aRecyclerView
vontade fará por você.fonte
layout_width
erawrap_content
. É estranho, porque isso não deve afetar a exibição da lista! Portanto, meu entendimento é que, quando você fornece false como parâmetro para o layoutinflater, o ListView adiciona os itens da lista ao ListView com parâmetros de layout que correspondem ao próprio ListView! : 0ViewHolder onCreateViewHolder(...) { View v = new MyItemView(parent.getContext); return new ViewHolder(v); }
Use RelativeLayout como pai imediato do CardView.
fonte
Isso funcionou para mim,
fonte
O jeito que eu fiz é:
Explicação: No onCreateViewHolde, depois de obter a visualização do cartão, obtenha a largura da tela e defina o parâmetro de layout adequadamente para a visualização do cartão.
fonte
Isso parece estar corrigido em
'com.android.support:recyclerview-v7:23.2.1'
Veja: RecyclerView wrap_content para mais discussões.
fonte
Basta definir novos parâmetros de layout
fonte
A implementação padrão força o uso de wrap_content no gerenciador de layout padrão:
Tudo o que você precisa fazer é substituir esse método no seu LayoutManager da seguinte maneira:
fonte
Isso funciona para mim
fonte
Use card_view: contentPadding com um valor negativo
Funcionou para mim
fonte
Quebrar
CardView
em um layout que tenha largura:match_parent
fonte