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, как показано ниже:



CardsBug



обратите внимание, что это было запущено на эмуляторе, а не на реальном устройстве.



Я делаю что-то не так, или это баг?

719   10  

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

это работает для меня

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

реализация по умолчанию принудительно использовать 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">

это сработало для меня

обертывание CardView в макете, который имеет ширину:match_parent

Comments

    Ничего не найдено.