Android RecyclerView在项目之间创建边距

Android RecyclerView在项目之间创建边距,android,android-recyclerview,material-design,Android,Android Recyclerview,Material Design,首先,如果这是个愚蠢的问题,我很抱歉。我不是在偷懒。 所以,问题是,我试图在Android应用程序中实现CardView/RecyclerView。我做到了,但问题是这些卡彼此间隔,我不知道如何修复它。我研究了代码,但一切似乎都很好 守则: 回收视图 <android.support.v7.widget.RecyclerView android:id="@+id/collapsing_recyclerview" android:layout_width="m

首先,如果这是个愚蠢的问题,我很抱歉。我不是在偷懒。 所以,问题是,我试图在Android应用程序中实现CardView/RecyclerView。我做到了,但问题是这些卡彼此间隔,我不知道如何修复它。我研究了代码,但一切似乎都很好

守则:

回收视图

<android.support.v7.widget.RecyclerView
        android:id="@+id/collapsing_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:padding="@dimen/activity_horizontal_margin">

 </android.support.v7.widget.RecyclerView>

CardView项目

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.CardView
    android:id="@+id/card_view"
    card_view:cardBackgroundColor="@color/colorAccent"
    android:layout_gravity="center"
    android:layout_width="fill_parent"
    android:layout_height="100dp"
    android:layout_margin="5dp"
    card_view:cardCornerRadius="2dp">

    <TextView
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="New Text"
        android:id="@+id/cardview.name" />

</android.support.v7.widget.CardView>


</LinearLayout>

适配器:

public class MyRecyclerViewAdapter extends RecyclerView
    .Adapter<MyRecyclerViewAdapter
    .DataObjectHolder> {
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<CardViewItem> mDataset;
private static MyClickListener myClickListener;

public static class DataObjectHolder extends RecyclerView.ViewHolder
        implements View
        .OnClickListener {
    TextView label;

    public DataObjectHolder(View itemView) {
        super(itemView);
        label = (TextView) itemView.findViewById(R.id.cardview_name);
        Log.i(LOG_TAG, "Adding Listener");
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        myClickListener.onItemClick(getAdapterPosition(), v);
    }
}

public void setOnItemClickListener(MyClickListener myClickListener) {
    this.myClickListener = myClickListener;
}

public MyRecyclerViewAdapter(ArrayList<CardViewItem> myDataset) {
    mDataset = myDataset;
}

@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.example_card_view, parent, false);

    DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
    return dataObjectHolder;
}

@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
    holder.label.setText(mDataset.get(position).getName());;
}

public void addItem(CardViewItem dataObj, int index) {
    mDataset.add(index, dataObj);
    notifyItemInserted(index);
}

public void deleteItem(int index) {
    mDataset.remove(index);
    notifyItemRemoved(index);
}

@Override
public int getItemCount() {
    return mDataset.size();
}

public interface MyClickListener {
    public void onItemClick(int position, View v);
}
}
公共类MyRecycleServiceAdapter扩展了RecyclerView
.适配器{
私有静态字符串LOG_TAG=“MyRecycleServiceAdapter”;
私有ArrayList数据集;
私有静态MyClickListener MyClickListener;
公共静态类DataObjectHolder扩展了RecyclerView.ViewHolder
实现视图
.OnClickListener{
文本视图标签;
公共数据对象持有者(视图项视图){
超级(项目视图);
label=(TextView)itemView.findViewById(R.id.cardview\u name);
i(Log_标记,“添加侦听器”);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图v){
myClickListener.onItemClick(getAdapterPosition(),v);
}
}
public void setOnItemClickListener(MyClickListener MyClickListener){
this.myClickListener=myClickListener;
}
公共MyRecycleServiceAdapter(ArrayList myDataset){
mDataset=myDataset;
}
@凌驾
public DataObjectHolder onCreateViewHolder(视图组父级,
int视图类型){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.example\u card\u view,父视图,false);
DataObjectHolder DataObjectHolder=新的DataObjectHolder(视图);
返回数据对象持有者;
}
@凌驾
public void onBindViewHolder(DataObjectHolder,int位置){
holder.label.setText(mDataset.get(position.getName());;
}
公共无效附加项(CardViewItem dataObj,int索引){
添加(索引,dataObj);
插入的项目(索引);
}
公共void deleteItem(int索引){
mDataset.remove(索引);
删除的项目(索引);
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
公共接口MyClickListener{
公共位置(内部位置,视图v);
}
}
希望你们能帮助我。谢谢

编辑:所以,我找到了答案。coulprit是android:layout\u height=“match\u parent”
在我的cardview项目中。我将其更改为“包装内容”,并修复了该问题。谢谢大家的帮助!:)

从CardView item.xml中删除此行

android:layout_margin=“5dp”


您可能希望它是
填充
而不是
边距

默认情况下,CardView会添加填充。尝试使用CardView属性card\u view:contentPadding,但如下设置属性的负值


卡片视图:contentPadding=“-3”

您是否尝试过使用您的RecyclerView进行项目装饰?这对于在RecyclerView中自定义分隔符非常有用

<android.support.v7.widget.RecyclerView
        android:id="@+id/collapsing_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:padding="@dimen/activity_horizontal_margin">

 </android.support.v7.widget.RecyclerView>
你可以看到: 我的自定义项装饰使用
getItemOffset()
如下:

public class MyItemDecoration extends RecyclerView.ItemDecoration {

    private final int decorationHeight;
    private Context context;

    public MyItemDecoration(Context context) {
        this.context = context;
        decorationHeight = context.getResources().getDimensionPixelSize(R.dimen.decoration_height);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        if (parent != null && view != null) {

            int itemPosition = parent.getChildAdapterPosition(view);
            int totalCount = parent.getAdapter().getItemCount();

            if (itemPosition >= 0 && itemPosition < totalCount - 1) {
                outRect.bottom = decorationHeight;
            }

        }

    }
}

我希望这将帮助您

为了在项目之间创建间距,我们可以使用
RecyclerView
ItemDecorator

addItemDecoration(object : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State,
    ) {
        super.getItemOffsets(outRect, view, parent, state)
        if (parent.getChildAdapterPosition(view) > 0) {
            outRect.top = 8.dp // Change this value with anything you want. Remember that you need to convert integers to pixels if you are working with dps :)
        }
    }
})
考虑到我粘贴的代码,需要考虑以下几点:

  • 您实际上不需要调用
    super.getItemOffset
    ,但我选择了调用,因为我想扩展基类定义的行为。如果库在幕后进行了更多的逻辑更新,我们将错过它

  • 除了将顶部间距添加到
    Rect
    之外,您还可以添加底部间距,但是获取适配器最后一项的逻辑更复杂,因此这可能会稍微好一点

  • 我使用扩展属性将简单整数转换为dps:
    8.dp
    。类似的方法可能会奏效:


请提供您当前布局的屏幕截图和模型,解释您希望它如何与众不同。您好,谢谢您的帮助。不幸的是,这并不能解决这个问题:很好,很干净,谢谢。
val Int.dp: Int
    get() = (this * Resources.getSystem().displayMetrics.density + 0.5f).toInt()

// Extension function works too, but invoking it would become something like 8.dp()