RecyclerView 定制item 分割线

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

}

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

{(Canvas c, RecyclerView parent, State state) {onDraw(c, parent);}(Canvas c, RecyclerView parent) {}(Canvas c, RecyclerView parent, State state) {onDrawOver(c, parent);}(Canvas c, RecyclerView parent) {}(Rect outRect, int itemPosition, RecyclerView parent) {outRect.set(0, 0, 0, 0);}(Rect outRect, View view, RecyclerView parent, State state) {getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewPosition(),parent);}}可以看到类中只有6个方法,并且有3个方法google已经不提倡使用了。其实我们看源码可知,不提倡使用的方法也就是比其他方法少了一个参数State state, State记录了RecyclerView中的一些基本信息,这里不深究。而我们定制Item 分割线真正要用到的方法其实只有两个,(Canvas c, RecyclerView parent, State state) {}(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);}@Overridepublic 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*/@Overridepublic 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 ;@Overrideprotected 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(newDividerItemDecoration(this,layoutManager.getOrientation()));mRecyclerView.setAdapter(new RecyclerAdapter());} }

命运如同手中的掌纹,无论多曲折,终掌握在自己手中。

RecyclerView 定制item 分割线

相关文章:

你感兴趣的文章:

标签云: