recyclerView添加自定义分割线
来源:互联网 发布:windows创建git服务器 编辑:程序博客网 时间:2024/06/05 11:13
recyclerview可以通过addItemDecoration()方法实现添加自定义分割线的功能。比如需要实现如下图功能
首先自己定义类继承自RecyclerView.ItemDecoration
public class MyDividerDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; /** * 用于绘制间隔样式 */ private Drawable mDivider; public MyDividerDecoration(Context context) { // 获取默认主题的属性 final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { // 绘制间隔,每一个item,绘制右边和下方间隔样式 int childCount = parent.getChildCount(); int spanCount = ((GridLayoutManager)parent.getLayoutManager()).getSpanCount(); int orientation = ((GridLayoutManager)parent.getLayoutManager()).getOrientation(); boolean isDrawHorizontalDivider = true; boolean isDrawVerticalDivider = true; int extra = childCount % spanCount; extra = extra == 0 ? spanCount : extra; for(int i = 0; i < childCount; i++) { isDrawVerticalDivider = true; isDrawHorizontalDivider = true; // 如果是竖直方向,最右边一列不绘制竖直方向的间隔 if(orientation == OrientationHelper.VERTICAL && (i + 1) % spanCount == 0) { isDrawVerticalDivider = false; } // 如果是竖直方向,最后一行不绘制水平方向间隔 if(orientation == OrientationHelper.VERTICAL && i >= childCount - extra) { isDrawHorizontalDivider = false; } // 如果是水平方向,最下面一行不绘制水平方向的间隔 if(orientation == OrientationHelper.HORIZONTAL && (i + 1) % spanCount == 0) { isDrawHorizontalDivider = false; } // 如果是水平方向,最后一列不绘制竖直方向间隔 if(orientation == OrientationHelper.HORIZONTAL && i >= childCount - extra) { isDrawVerticalDivider = false; } if(isDrawHorizontalDivider) { drawHorizontalDivider(c, parent, i); } if(isDrawVerticalDivider) { drawVerticalDivider(c, parent, i); } } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount(); int orientation = ((GridLayoutManager)parent.getLayoutManager()).getOrientation(); int position = parent.getChildLayoutPosition(view); if(orientation == OrientationHelper.VERTICAL && (position + 1) % spanCount == 0) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); return; } if(orientation == OrientationHelper.HORIZONTAL && (position + 1) % spanCount == 0) { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); return; } outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } /** * 绘制竖直间隔线 * * @param canvas * @param parent * 父布局,RecyclerView * @param position * irem在父布局中所在的位置 */ private void drawVerticalDivider(Canvas canvas, RecyclerView parent, int position) { final View child = parent.getChildAt(position); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin + mDivider.getIntrinsicHeight(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } /** * 绘制水平间隔线 * * @param canvas * @param parent * 父布局,RecyclerView * @param position * item在父布局中所在的位置 */ private void drawHorizontalDivider(Canvas canvas, RecyclerView parent, int position) { final View child = parent.getChildAt(position); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); }}其次在drawable文件夹下新建xml文件定义间隔线宽度与颜色
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@color/bg_gray"/> <size android:height="2dp" android:width="2dp"/></shape>然后在styles.xml中定义的应用主题里替换掉listdivider属性。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:listDivider">@drawable/my_divider</item> </style>接下来就是调用了
recyclerview.addItemDecoration(new MyDividerDecoration(this));
到这里添加分割线的功能就实现了
阅读全文
0 0
- recyclerView添加自定义分割线
- RecyclerView调用addItemDecoration添加自定义分割线
- RecyclerView调用addItemDecoration添加自定义分割线
- Recyclerview添加自定义的虚线分割线
- RecyclerView添加分割线
- recyclerview添加分割线
- RecyclerView添加分割线
- RecyclervIew添加分割线
- RecyclerView自定义分割线
- RecyclerView自定义分割线
- RecyclerView自定义分割线
- RecyclerView自定义分割线
- RecyclerView如何添加分割线
- Android RecyclerView添加分割线
- RecyclerView添加表格分割线
- RecyclerView 的添加分割线
- 为RecyclerView添加分割线
- RecyclerView添加虚线分割线
- 14个你不知道的JavaScript调试技巧
- sed命令详解
- 前端js、jQuery实现日期格式化、字符串格式化
- 我国大数据战略实施面临的五大挑战
- 快速排序
- recyclerView添加自定义分割线
- Android ble蓝牙4.0开发遇到的问题及解决方法
- 记录Windows下部署多个tomcat设置自动重启
- TeraTerm 终端工具自定义快捷键
- CTE 递归
- Spring使用AOP记录日志(javaconfig配置)
- HTTP代理(转发代理&反向代理)与重定向
- JavaScript
- C++ : 与::的使用