CardView layout width= "match parent" не соответствует ширине родительского RecyclerView
у меня есть фрагмент с содержит RecyclerView с 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" />
элемент в RecyclerView является CardView также с 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>
Я надуваю вид элемента, как показано ниже:
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, как показано ниже:

обратите внимание, что это было запущено на эмуляторе, а не на реальном устройстве.
Я делаю что-то не так, или это баг?
10 ответов:
документы на
inflate:раздуть новую иерархию представлений из указанного xml-ресурса. Бросает InflateException, если есть ошибка.
параметры
ресурс идентификатор загружаемого ресурса XML-макета (например, R. макет.прекрасно) корень
view быть родителем сгенерированная иерархия (если attachToRoot имеет значение true), либо просто объект, который предоставляет набор значений LayoutParams для корня этот возвращенная иерархия (если attachToRoot имеет значение false.)
attachToRoot ли завышенная иерархия должна быть прикреплена к корневому параметру? Если false, root используется только для создания правильного подкласса LayoutParams для корневого представления в XML. Возвращает корневое представление раздутая иерархия. Если root был указан и attachToRoot является true, это корень; в противном случае это корень раздутого XML-файла.здесь важно не поставка правда, но do поставить родителей:
LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem, parent, false);поставляет
parentвид позволяет надувать знать, какие layoutparams использовать. Поставляя
используйте 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); }
используйте 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">это сработало для меня
Comments