如何在RecyclerView中的项目之间添加分隔符和空格

这是一个示例,说明以前如何在ListView类中使用dividerdividerHeight参数执行此操作:

<列表视图
android:id=&[email protected]+id/活动“主页”列表“视图”;
android:layout_width="匹配“家长”;
android:layout_height="匹配“家长”;
android:divider=&[email protected]安卓:彩色/透明“;
android:dividerHeight="8dp“/&燃气轮机;

但是,我在RecyclerView类中看不到这种可能性

<android.support.v7.widget.RecyclerView
android:id=&[email protected]+id/活动“家庭”回收商“视图”;
android:layout_width="匹配“家长”;
android:layout_height="匹配“家长”;
android:scrollbars="垂直的/&燃气轮机;

在这种情况下,是否可以定义边距和/或将自定义分隔符视图直接添加到列表项的布局中,或者是否有更好的方法来实现我的目标

2016年10月更新

Android支持库25.0.0版引入了DividerItemDecoration类:

DividerItemDecoration是一个RecyclerView.ItemDecoration,可以用作LinearLayoutManager项目之间的分隔符。它支持水平方向和垂直方向

用法:

DividerItemDecoration DividerItemDecoration=new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
回收视图。附加装饰(分割装饰);

先前的答案

有些答案要么使用后来被弃用的方法,要么没有给出完整的解决方案,所以我尝试做一个简短的、最新的总结


ListView不同,RecyclerView类没有任何与除法器相关的参数。相反,您需要扩展ItemDecoration,一个RecyclerView的内部类:

项目装饰允许应用程序从适配器的数据集向特定项目视图添加特殊图形和布局偏移。这对于在项目、高光、可视分组边界等之间绘制分隔线非常有用

所有项目装饰都是按照添加顺序绘制的,在项目视图之前(在onDraw()中)和项目之后(在onDrawOver(CanvasRecyclerViewRecyclerView.State)

垂直间距项目装饰

扩展ItemDecoration,添加一个自定义构造函数,该构造函数将空格height作为参数,并重写getItemOffsets()方法:

公共类VerticalSpaceItemDecoration扩展了RecyclerView.ItemDecoration{
私人最终整数垂直空间高度;
公共垂直空间项目装饰(int垂直空间高度){
this.verticalSpaceHeight=垂直空间高度;
}
@凌驾
public void getItemOffset(Rect-outRect、View-View、RecyclerView-parent、,
RecyclerView.State){
outRect.bottom=垂直空间高度;
}
}

如果不希望在最后一项下方插入空格,请添加以下条件:

if(parent.getChildAdapterPosition(视图)!=parent.getAdapter().getItemCount()-1){
outRect.bottom=垂直空间高度;
}

注意:您还可以修改outRect.topoutRect.leftoutRect.right属性以获得所需的效果

分隔器项目装饰

扩展ItemDecoration并覆盖onDraw()方法:

公共类DividerItemDecoration扩展了RecyclerView.ItemDecoration{
私有静态final int[]ATTRS=new int[]{android.R.attr.listDivider};
专用可拉丝分隔器;
/**
*将使用默认分隔符
*/
公共DividerItemDecoration(上下文){
最终类型Darray styledAttributes=上下文。获取styledAttributes(属性);
分隔符=styledAttributes.getDrawable(0);
styledAttributes.recycle();
}
/**
*将使用自定义分隔符
*/
公共DividerItemDecoration(上下文,int resId){
divider=ContextCompat.getDrawable(context,resId);
}
@凌驾
公共void onDraw(画布c、RecyclerView父级、RecyclerView.State){
int left=parent.getPaddingLeft();
int right=parent.getWidth()-parent.getPaddingRight();
int childCount=parent.getChildCount();
对于(int i=0;i<childCount;i++){
View child=parent.getChildAt(i);
RecycleView.LayoutParams params=(RecycleView.LayoutParams)child.getLayoutParams();
int top=child.getBottom()+params.bottomMargin;
int bottom=top+divider.getIntrinsicHeight();
分隔器.立根(左、上、右、下);
图(c);
}
}
}

您可以调用第一个使用默认Android divider属性的构造函数,也可以调用第二个使用您自己的drawable属性的构造函数,例如drawable/divider.xml

“xml版本=”1.0“编码=”utf-8“?”;
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=“矩形”gt;
<尺寸:高度=“1dp”/>
<solid android:color="ff992900"/>
</shape>

注意:如果要在项目上方绘制分隔符,请替代onDrawOver()方法

用法

要使用新类,请将VerticalSpaceItemDecorationDividerSpaceItemDecoration添加到RecyclerView,例如在片段的onCreateView()方法中:

私有静态最终整数垂直项目空间=48;
私人回收站;
私人直线酒店经理直线酒店经理;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u feed,container,false);
recyclerView=(recyclerView)rootView.findViewById(R.id.fragment\u home\u recycler\u视图);
linearLayoutManager=新的linearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
//添加项目装饰
recyclerView.addItemDecoration(新的垂直空间项目装饰(垂直项目空间));
//或
addItemDecoration(新的DividerItemDecoration(getActivity());
//或
回收视图。附加装饰(
新的DividerItemDecoration(getActivity(),R.drawable.divider));
setAdapter(…);
返回rootView;
}

还有Lucas Rocha的图书馆,应该可以简化物品的装饰过程。不过我还没试过

其特点包括:

  • 库存物品装饰的集合,包括:
  • 项目间距水平/垂直分隔符
  • 列表项

发表评论