如何在Android RecyclerView中添加分隔线?

我正在开发一个Android应用程序,我正在使用RecyclerView 。 我需要在RecyclerView添加一个分隔符 。 我试图添加 –

 recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 

下面是我的xml代码 –

  <android.support.v7.widget.RecyclerView android:id="@+id/drawerList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" /> 

正确的方法是为RecyclerView定义ItemDecoration如下

SimpleDividerItemDecoration.java

 public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public SimpleDividerItemDecoration(Context context) { mDivider = context.getResources().getDrawable(R.drawable.line_divider); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } 

line_divider.xml:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="1dp" android:height="1dp" /> <solid android:color="@color/dark_gray" /> </shape> 

最后把它设置成这样

 recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this)); 

编辑

正如@Alan Solitar指出的那样

 context.getResources().getDrawable(R.drawable.line_divider); 

是折旧,而不是你可以使用的

 ContextCompat.getDrawable(context,R.drawable.line_divider); 

在2016年10月的更新中,支持库v25.0.0现在具有可用的基本水平和垂直分隔符的默认实现!

https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html

 mDividerItemDecoration = new DividerItemDecoration( recyclerView.getContext(), mLayoutManager.getOrientation() ); recyclerView.addItemDecoration(mDividerItemDecoration); 

只需添加一个查看您的项目适配器的结尾:

 <View android:layout_width="match_parent" android:layout_height="1px" android:background="#FFFFFF"/> 

如果你想有横向和纵向的分隔线,

  1. 定义水平和垂直分隔符drawables:

    horizo​​ntal_divider.xml

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:height="1dip" /> <solid android:color="#22000000" /> </shape> 

    vertical_divider.xml

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:width="1dip" /> <solid android:color="#22000000" /> </shape> 
  2. 添加下面的代码段:

     DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.HORIZONTAL); Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider); verticalDecoration.setDrawable(verticalDivider); recyclerview.addItemDecoration(verticalDecoration); DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.VERTICAL); Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider); horizontalDecoration.setDrawable(horizontalDivider); recyclerview.addItemDecoration(horizontalDecoration); 

所有这些答案让我接近,但他们都错过了一个关键的细节。 经过一番研究,我发现最简单的路线是这三个步骤的组合:

  1. 使用支持库的DividerItemDecoration
  2. 使用正确的颜色创build一个分隔线
  3. 在你的主题中设置这个divider作为listDivider

第1步:configurationRecyclerView

 recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())); 

第2步:在res / drawable / divider_gray.xml文件中

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <size android:width="1px" android:height="1px" /> <solid android:color="@color/gray" /> </shape> 

第3步:在应用程序的主题

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Other theme items above --> <item name="android:listDivider">@drawable/divider_gray</item> </style> 

编辑: 更新为跳过最后的分频器:
在使用了这一点之后,我意识到在最后一个项目之后画了一个分隔符,这很烦人。 所以我修改第1步如下,以覆盖DividerItemDecoration中的默认行为(当然,使一个单独的类是另一种select):

 recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())) { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // hide the divider for the last child if (position == parent.getAdapter().getItemCount() - 1) { outRect.setEmpty(); } else { super.getItemOffsets(outRect, view, parent, state); } } } ); 

这里是一个简单的自定义分隔符(垂直分隔符/ 1dp高度/黑色)的代码:

它假设你有支持库:

 compile "com.android.support:recyclerview-v7:25.1.1" 

java代码

  DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider)); recyclerView.addItemDecoration(divider); 

然后custom_divider.xml文件示例:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:height="1dp" /> <solid android:color="@android:color/black" /> </shape> 

所以这可能不是正确的方法,但我只是添加一个视图到recyclerView的单个项目视图(因为我不认为有一个内置函数),如下所示:

 <View android:layout_width="fill_parent" android:layout_height="@dimen/activity_divider_line_margin" android:layout_alignParentBottom="true" android:background="@color/tasklist_menu_dividerline_grey" /> 

这意味着每个项目将有一条线填充它的底部。 我用#111111背景做了1dp高。 这也给它一种“3D”效果。

我认为你正在使用FragmentsRecyclerView

创buildRecyclerViewLayoutManager对象后,只需添加这些行即可

 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration); 

而已!

它支持HORIZONTAL和VERTICAL方向。

yqritc的RecyclerView-FlexibleDivider使这一个class轮。 首先添加到您的build.gradle

 compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter() 

现在你可以在你设置你的recyclerView的适配器的地方configuration和添加一个divider:

 recyclerView.setAdapter(myAdapter); recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).color(Color.RED).sizeResId(R.dimen.divider).marginResId(R.dimen.leftmargin, R.dimen.rightmargin).build()); 

res / drawable文件夹中创build一个单独的xml文件

  <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:height="1dp" /> <solid android:color="@android:color/black" /> </shape> 

主要活动中连接该xml文件(your_file),如下所示:

 DividerItemDecoration divider = new DividerItemDecoration( recyclerView.getContext(), DividerItemDecoration.VERTICAL ); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file)); recyclerView.addItemDecoration(divider); 

为了让NJ的答案更简单一些,你可以这样做:

 public class DividerColorItemDecoration extends DividerItemDecoration { public DividerColorItemDecoration(Context context, int orientation) { super(context, orientation); setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider)); } } 

不幸的是,Android让一些事情变得太复杂了。 最简单的方法来实现你想要的,而不是在这里实现DividerItemDecoration:

将RecyclerView的背景颜色添加到所需的分隔线颜色:

 <RecyclerView android:id="@+id/rvList" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/colorLightGray" android:scrollbars="vertical" tools:listitem="@layout/list_item" android:background="@android:color/darker_gray"/> 

将下边距(android:layout_marginBottom)添加到项目(list_item.xml)的布局根目录:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="1dp"> <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="John Doe" /> <TextView android:id="@+id/tvDescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tvName" android:text="Some description blah blah" /> </RelativeLayout> 

这应该给项目之间1dp的空间和RecyclerView的背景颜色(这是深灰色将显示为分隔符)。

你需要添加下一行…

 mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); 

试试这个简单的单行代码

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));