如何在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"/>
如果你想有横向和纵向的分隔线,
-
定义水平和垂直分隔符drawables:
horizontal_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>
-
添加下面的代码段:
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);
所有这些答案让我接近,但他们都错过了一个关键的细节。 经过一番研究,我发现最简单的路线是这三个步骤的组合:
- 使用支持库的DividerItemDecoration
- 使用正确的颜色创build一个分隔线
- 在你的主题中设置这个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”效果。
我认为你正在使用Fragments
有RecyclerView
创buildRecyclerView
和LayoutManager
对象后,只需添加这些行即可
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));