RecyclerView创建项之间的边距

3
首先,如果这是一个愚蠢的问题,我很抱歉。我并不懒惰。 问题是,我正在尝试在Android应用程序中实现CardView / 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>

卡片视图项

<?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>

Adapter :

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

希望你们能帮我。谢谢!

编辑:我找到了答案。罪魁祸首是我的卡片视图项中的android:layout_height="match_parent"。我将其改为"wrap_content"并解决了问题。感谢大家的帮助! :)


请提供您当前布局的屏幕截图和一个模型,解释您希望它有何不同。 - Code-Apprentice
4个回答

16

你是否尝试过在你的RecyclerView中使用ItemDecoration?这对于自定义RecyclerView中的分隔符非常有用。

你可以看一下这个例子: 我的自定义ItemDecoration 使用 getItemOffsets() 像这样:

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

        }

    }
}

然后您可以将R.dimen.decoration_height设置为您想要的值。

在我的活动中,当我实例化RecyclerListView时,我需要执行以下操作:

myList.addItemDecoration(MyItemDecoration(this))
myList.setLayoutManager(LinearLayoutManager(this))
myList.setAdapter(adapter)

我希望这能帮到你。


3

从您的CardView项目.xml中删除此行。

android:layout_margin="5dp"

您可能希望将其更改为padding而不是margin


嗨,感谢您的帮助。不幸的是,这并没有解决问题:/ - quaker

2
为了在项目之间创建间距,我们可以使用RecyclerViewItemDecorator
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.getItemOffsets,但是我选择这样做,因为我想要扩展基础类定义的行为。如果库更新并在后台执行更多逻辑,我们可能会错过这个更新。

  • 作为给 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()

1

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

card_view:contentPadding="-3"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接