您好,我正在遵循这个教程:
http://www.journaldev.com/10024/android-recyclerview-and-cardview-example-tutorial
现在我遇到了一个奇怪的问题,RecyclerView
中每个CardView
项之间的边距太大。
问题:
如何减少放置在RecyclerView
内的每个CardView
项之间的边距?
您好,我正在遵循这个教程:
http://www.journaldev.com/10024/android-recyclerview-and-cardview-example-tutorial
现在我遇到了一个奇怪的问题,RecyclerView
中每个CardView
项之间的边距太大。
问题:
如何减少放置在RecyclerView
内的每个CardView
项之间的边距?
我遇到了类似的问题,每行在recyclerview中使用RelativeLayout作为根元素。
为解决此问题,请找到保存每行的xml文件,并确保根元素的高度为wrap_content
而非match_parent
。
我创建了一个类来管理这个问题。这个类为recyclerView内部的项目设置不同的边距:只有第一行会有顶部边距,只有第一列会有左侧边距。
public class RecyclerViewMargin extends RecyclerView.ItemDecoration {
private final int columns;
private int margin;
/**
* constructor
* @param margin desirable margin size in px between the views in the recyclerView
* @param columns number of columns of the RecyclerView
*/
public RecyclerViewMargin(@IntRange(from=0)int margin ,@IntRange(from=0) int columns ) {
this.margin = margin;
this.columns=columns;
}
/**
* Set different margins for the items inside the recyclerView: no top margin for the first row
* and no left margin for the first column.
*/
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildLayoutPosition(view);
//set right margin to all
outRect.right = margin;
//set bottom margin to all
outRect.bottom = margin;
//we only add top margin to the first row
if (position <columns) {
outRect.top = margin;
}
//add left margin only to the first column
if(position%columns==0){
outRect.left = margin;
}
}
}
你可以通过以下方式在你的RecyclerView中进行设置
RecyclerViewMargin decoration = new RecyclerViewMargin(itemMargin, numColumns);
recyclerView.addItemDecoration(decoration);
在 cards_layout.xml 中找到属性 card_view:cardUseCompatPadding="true"
并删除它。启动应用程序,您会发现每个卡片视图项目之间没有边距。
添加您喜欢的边距属性。例如:
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
在RecyclerView中添加项目间距时,使用Android框架提供的RecyclerView.ItemDecoration要比使用XML更好。
因此,我创建了一个库来解决这个问题。
https://github.com/TheKhaeng/recycler-view-margin-decoration
像这样在Recyclerview
的项目布局中使用CardView
:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/tools"
card_view:cardCornerRadius="10dp"
app:cardBackgroundColor="#ACACAC"
card_view:cardElevation="5dp"
app:contentPadding="10dp"
card_view:cardUseCompatPadding="true">
在CardView项目中使用CompatPadding
如果您想在 XML 中实现此操作,只需将 paddingTop
和 paddingLeft
设置为您的 RecyclerView
并将等量的 layoutMarginBottom
和 layoutMarginRight
设置为您填充到 RecyclerView
中的项目(或反之亦然)。
为了在RecyclerView中的两个项目之间添加空间,我只需添加marginTop
和marginBottom
即可,这样就可以正常工作。
<androidx.cardview.widget.CardView
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_width="match_parent"
android:layout_height="200dp"
android:elevation="15dp"
app:cardCornerRadius="10dp">
我之前遇到过类似的问题,我的解决方案是将布局边距设为负值。也许不是最好的做法,但它确实奏效了。
android:layout_marginStart="-8dp"
android:layout_marginEnd="-8dp"