RecyclerView 定制item 分割线

RecyclerView作为 ListView GridView的升级版,但是却不能在xml中指定item之间的分割线
但这也有个好处,是我们更灵活的定制我们的分割线,可以定制任意类型的分割线,下面我们来看看
怎么定制item 之间的分割线
public void addItemDecoration(ItemDecoration decor) {

}

RecyclerView为我们提供了addItemDecoration的方法,需要传入ItemDecoration对象,而 ItemDecoration
就是我们实现分割线的类,
ItemDecoration 是一个抽象类,所以我们需要实现它,

  public static abstract class ItemDecoration {

         public void onDraw(Canvas c, RecyclerView parent, State state) {
             onDraw(c, parent);
         }

         @Deprecated
         public void onDraw(Canvas c, RecyclerView parent) {
         }

         public void onDrawOver(Canvas c, RecyclerView parent, State state) {
             onDrawOver(c, parent);
         }

         @Deprecated
         public void onDrawOver(Canvas c, RecyclerView parent) {
         }

         @Deprecated
         public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
             outRect.set(0, 0, 0, 0);
         }

         public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
             getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewPosition(),
                     parent);
         }
    }

     可以看到类中只有6个方法,并且有3个方法google已经不提倡使用了。其实我们看源码可知,不提倡使用的方法
     也就是比其他方法少了一个参数State state, State记录了RecyclerView中的一些基本信息,这里不深究。

     而我们定制Item 分割线真正要用到的方法其实只有两个,
     1、画分割线     public void onDraw(Canvas c, RecyclerView parent, State state) {

                    }
     2、设置分割线的size   public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {

                          }
     ok,接下来就来看看怎么画分割线和设置其size:
 package moon.recyclerveiw;

 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.util.TypedValue;
 import android.view.View;

 /**
  * Created by moon.zhong on 2015/2/11.
  */
 public class DividerItemDecoration extends RecyclerView.ItemDecoration{

     /*
     * RecyclerView的布局方向,默认先赋值
     * 为纵向布局
     * RecyclerView 布局可横向,也可纵向
     * 横向和纵向对应的分割想画法不一样
     * */
     private int mOrientation = LinearLayoutManager.VERTICAL ;

     /**
      * item之间分割线的size,默认为1
      */
     private int mItemSize = 1 ;

     /**
      * 绘制item分割线的画笔,和设置其属性
      * 来绘制个性分割线
      */
     private Paint mPaint ;

     /**
      * 构造方法传入布局方向,不可不传
      * @param context
      * @param orientation
      */
     public DividerItemDecoration(Context context,int orientation) {
         this.mOrientation = orientation;
         if(orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL){
             throw new IllegalArgumentException("请传入正确的参数") ;
         }
         mItemSize = (int) TypedValue.applyDimension(mItemSize, TypedValue.COMPLEX_UNIT_DIP,context.getResources().getDisplayMetrics());
         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG) ;
         mPaint.setColor(Color.BLUE);
         /*设置填充*/
         mPaint.setStyle(Paint.Style.FILL);
     }

     @Override
     public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
         if(mOrientation == LinearLayoutManager.VERTICAL){
             drawVertical(c,parent) ;
         }else {
             drawHorizontal(c,parent) ;
         }
     }

     /**
      * 绘制纵向 item 分割线
      * @param canvas
      * @param parent
      */
     private void drawVertical(Canvas canvas,RecyclerView parent){
         final int left = parent.getPaddingLeft() ;
         final int right = parent.getMeasuredWidth() - parent.getPaddingRight() ;
         final int childSize = parent.getChildCount() ;
         for(int i = 0 ; i < childSize ; i ++){
             final View child = parent.getChildAt( i ) ;
             RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
             final int top = child.getBottom() + layoutParams.bottomMargin ;
             final int bottom = top + mItemSize ;
             canvas.drawRect(left,top,right,bottom,mPaint);
         }
     }

     /**
      * 绘制横向 item 分割线
      * @param canvas
      * @param parent
      */
     private void drawHorizontal(Canvas canvas,RecyclerView parent){
         final int top = parent.getPaddingTop() ;
         final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() ;
         final int childSize = parent.getChildCount() ;
         for(int i = 0 ; i < childSize ; i ++){
             final View child = parent.getChildAt( i ) ;
             RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
             final int left = child.getRight() + layoutParams.rightMargin ;
             final int right = left + mItemSize ;
             canvas.drawRect(left,top,right,bottom,mPaint);
         }
     }

     /**
      * 设置item分割线的size
      * @param outRect
      * @param view
      * @param parent
      * @param state
      */
     @Override
     public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
         if(mOrientation == LinearLayoutManager.VERTICAL){
             outRect.set(0,0,0,mItemSize);
         }else {
             outRect.set(0,0,mItemSize,0);
         }
     }
}
 MainActivity代码如下:
 package moon.recyclerveiw;

 import android.support.v7.app.ActionBarActivity;
 import android.os.Bundle;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;

 public class MainActivity extends ActionBarActivity {

     private RecyclerView mRecyclerView ;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         mRecyclerView = (RecyclerView) findViewById(R.id.id_recycle);
         LinearLayoutManager layoutManager = new LinearLayoutManager(this) ;
         layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
         mRecyclerView.setLayoutManager(layoutManager);
         mRecyclerView.addItemDecoration(new          DividerItemDecoration(this,layoutManager.getOrientation()));
         mRecyclerView.setAdapter(new RecyclerAdapter());
     }
 }

你可能感兴趣的:(RecyclerView 定制item 分割线)