Android RecyclerView在项目之间创建边距
首先,如果这是个愚蠢的问题,我很抱歉。我不是在偷懒。 所以,问题是,我试图在Android应用程序中实现CardView/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.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()