RecyclerView调用addItemDecoration添加自定义分割线

最近在做项目中使用RecyclerView的addItemDecoration方法添加分割线,出现了分割线在有些手机(比如魅蓝和小米手机)显示不出来的问题。

后来在网上找了一些资料,还是无法修改分割线颜色,最后找到了正确的方法,实现了修改分割线颜色和高度。

自定义RecyclerView.ItemDecoration类的子类SimpleDividerItemDecoration类,代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {  
  2.     private Drawable mDivider;  
  3.   
  4.     public SimpleDividerItemDecoration(Context context) {  
  5.         mDivider = context.getResources().getDrawable(R.drawable.line_divider);  
  6.     }  
  7.   
  8.     @Override  
  9.     public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {  
  10.         int left = parent.getPaddingLeft();  
  11.         int right = parent.getWidth() - parent.getPaddingRight();  
  12.   
  13.         int childCount = parent.getChildCount();  
  14.         for (int i = 0; i < childCount; i++) {  
  15.             View child = parent.getChildAt(i);  
  16.   
  17.             RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();  
  18.   
  19.             int top = child.getBottom() + params.bottomMargin;  
  20.             int bottom = top + mDivider.getIntrinsicHeight();  
  21.   
  22.             mDivider.setBounds(left, top, right, bottom);  
  23.             mDivider.draw(c);  
  24.         }  
  25.     }  
  26. }  

说明:context.getResources().getDrawable(R.drawable.line_divider);

line_divider.xml:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="rectangle">  
  4.     <size  
  5.         android:width="1dp"  
  6.         android:height="1dp" />  
  7.     <solid android:color="@color/dark_gray" />  
  8.   
  9. </shape>  

说明:通过修改Android:color和android:height可以修改分割线颜色和宽度。

最后,RecyclerView对象使用addItemDecoration方法添加分割线,代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));  
原文地址:http://stackoverflow.com/questions/31242812/how-can-a-divider-line-be-added-in-an-android-recyclerview

上面方式定义的公共类SimpleDividerItemDecoration类可以被许多页面的RecyclerView共用,分割线的宽度和颜色统一,缺点是无法实现不同页面使用不同颜色和高度的分割线。

以下对SimpleDividerItemDecoration进行了修正,实现了自定义颜色和高度的分割线效果。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {  
  2.   
  3.     private Drawable mDivider;     //分割线Drawable  
  4.     private int mDividerHeight;  //分割线高度  
  5.   
  6.     /** 
  7.      * 使用line_divider中定义好的颜色 
  8.      * @param context 
  9.      * @param dividerHeight 分割线高度 
  10.      */  
  11.     public SimpleDividerItemDecoration(Context context, int dividerHeight) {  
  12.         mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);  
  13.         mDividerHeight = dividerHeight;  
  14.     }  
  15.   
  16.     /** 
  17.      * 
  18.      * @param context 
  19.      * @param divider 分割线Drawable 
  20.      * @param dividerHeight 分割线高度 
  21.      */  
  22.     public SimpleDividerItemDecoration(Context context, Drawable divider, int dividerHeight){  
  23.         if(divider == null){  
  24.             mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);  
  25.         }else{  
  26.             mDivider = divider;  
  27.         }  
  28.         mDividerHeight = dividerHeight;  
  29.     }  
  30.   
  31.     //获取分割线尺寸  
  32.     @Override  
  33.     public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {  
  34.         super.getItemOffsets(outRect, view, parent, state);  
  35.         outRect.set(000, mDividerHeight);  
  36.     }  
  37.   
  38.     @Override  
  39.     public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {  
  40.         int left = parent.getPaddingLeft();  
  41.         int right = parent.getWidth() - parent.getPaddingRight();  
  42.   
  43.         int childCount = parent.getChildCount();  
  44.         for (int i = 0; i < childCount; i++) {  
  45.             View child = parent.getChildAt(i);  
  46.   
  47.             RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();  
  48.   
  49.             int top = child.getBottom() + params.bottomMargin;  
  50.             int bottom = top + mDividerHeight;  
  51.             mDivider.setBounds(left, top, right, bottom);  
  52.             mDivider.draw(c);  
  53.         }  
  54.     }  
使用方法:

  
  
[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. Drawable drawable = ContextCompat.getDrawable(getActivity(), R.drawable.line_divider_red);  
  2. recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this,drawable, 5));  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值