CardView layout_width =“match_parent”与父RecyclerView宽度不匹配
我有一个片段,其中包含一个带有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中的项目也是一个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,如下所示:
请注意,这是在仿真器上运行,而不是一个真正的设备。
我做错了什么,或者是一个错误?
inflate
的文件:
从指定的xml资源膨胀一个新的视图层次结构。 如果出现错误,则抛出InflateException。
参数
要加载的XML布局资源的资源 ID(例如,R.layout.main_page)
视图是生成的层次结构的父级(如果attachToRoot为true),或者只是为返回的层次结构的根提供一组LayoutParams值的对象(如果attachToRoot为false)。
attachToRoot是否将膨胀层次结构附加到根参数? 如果为false,则root仅用于为XML中的根视图创buildLayoutParams的正确子类。 返回充气层次结构的根视图。 如果提供了root并且attachToRoot为true,则这是root; 否则它是膨胀的XML文件的根。
在这里重要的是不提供真实的,但提供给家长:
LayoutInflater.from(parent.getContext()) .inflate(R.layout.card_listitem, parent, false);
提供parent
视图,让inflater知道使用什么样的layoutparams。 提供false
参数告诉它不要把它附加到父对象上。 这就是RecyclerView
会为你做的。
使用RelativeLayout作为CardView的直接父对象。
<RelativeLayout android:layout_width="match_parent" ... > <CardView android:layout_width="match_parent" ... > </CardView> </RelativeLayout>
我做的方式是:
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中获取屏幕宽度,然后相应地设置卡片视图的布局参数。
这对我有用,
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);
这似乎是固定在'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);
默认实现强制在默认布局pipe理器中使用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
的布局中