recycleview的虽然没有直接定义分割线的方法,但是却确定供了 RecyclerView.ItemDecoration这个类可以实现分割线。
重写这个类的getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)方法就可实现分割线。
先上代码
@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.set(2, 4, 5, 6);//左边分割线,上分割线,右分割线,下分割线 }
这样即可设置它的分割线。这个方法的意思是设置每个item的上下左右的偏移量,偏移的那一部分就是分割线。当在绘制每一个item时,会根据每一个itemView是设置偏移量,对item绘制的位置进行处理偏移,于是就形成了分割线。outRect对象所设置的四个参数分别就是左边,上边,右边,下面的偏移量的值。
但是这样设置出来的分割线的颜色只是和recycleview的背景颜色相同的,不能自定义颜色。那么接下来就需要自定义分割线颜色。
则需要重写ItemDecoration的 public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)方法。其实是在针对recycleview部分重写。所以所需要的canvas是recyclevie绘制时的画布,以recycleview为坐标系的建立。
好了开始放图放代码。
package com.gzl.application.myapplication.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; /** * 对垂直列表,水平列表或者grid格子列表的分割线设置 */ public class NewItemDecoration extends RecyclerView.ItemDecoration { /** * 画笔 */ private Paint paint; /** * 水平分割线高度 */ private int horizonDivider = 1; /** * 垂直分割线宽度 */ private int verticalDivider = 10; /** * 水平分割线颜色 */ private int horizonDividerColor = 0xfffefefe; /** * 垂直分割线颜色 */ private int verticalDividererColor = 0xfffefefe; /** * 分割线为图片样式 */ Drawable drawable; public NewItemDecoration(int divider) { this.horizonDivider = divider; this.verticalDivider = divider; init(); } public NewItemDecoration(int horizonDivider, int verticalDivider) { this.horizonDivider = horizonDivider; this.verticalDivider = verticalDivider; init(); } private void init() { //设置画笔 paint = new Paint(); paint.setStyle(Paint.Style.FILL); //或者Color.parseColor(#ff0000); } public void setColor(int color) { this.horizonDivider = color; this.verticalDivider = color; } public void setColor(int horizonDividerColor, int verticalDividererColor) { this.horizonDividerColor = horizonDividerColor; this.verticalDividererColor = verticalDividererColor; // paint.setColor(horizonDividerColor); } /** * 设置分割线为一张图片 * * @param drawableId * @param context */ public void setDrawable(int drawableId, Context context) { drawable = ContextCompat.getDrawable(context, drawableId); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int position = parent.getChildAdapterPosition(view); if (parent.getLayoutManager() instanceof GridLayoutManager) { //格子布局 int count = ((GridLayoutManager) (parent.getLayoutManager())).getSpanCount(); if (position < count) { //不需要设置上面的horizonDivider,第一排格子 if (position == 0) { //第一个不需要设置分割线 outRect.set(0, 0, 0, 0);//左边分割线,上分割线,右分割线,下分割线 } else { //需要设置左边分割线 outRect.set(verticalDivider, 0, 0, 0); } } else { //第二排 if (position % count == 0) { //第一列 outRect.set(0, horizonDivider, 0, 0); } else { //不是第一列 outRect.set(verticalDivider, horizonDivider, 0, 0); } } } else { int orientation = ((LinearLayoutManager) (parent.getLayoutManager())).getOrientation(); if (orientation == LinearLayoutManager.VERTICAL) { //垂直布局 if (position != 0) { //第二个开始 outRect.set(0, horizonDivider, 0, 0); } else { //第一个 outRect.set(0, 0, 0, 0); } } else { //水平布局 if (position != 0) { //第二个开始 outRect.set(verticalDivider, 0, 0, 0); } else { //第一个 outRect.set(0, 0, 0, 0); } } } } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View view = parent.getChildAt(i); int position = parent.getChildAdapterPosition(view); if (parent.getLayoutManager() instanceof GridLayoutManager) { //格子布局 int count = ((GridLayoutManager) (parent.getLayoutManager())).getSpanCount(); if (position < count) { //不需要设置上面的horizonDivider if (position != 0) { drawVertical(view, c); } } else { if (position % count == 0) { //竖排的第一个 drawHorizon(view, c); } else { drawGridHorizon(view, c); drawVertical(view, c); } } } else { int orientation = ((LinearLayoutManager) (parent.getLayoutManager())).getOrientation(); if (orientation == LinearLayoutManager.VERTICAL) { //垂直布局 if (position != 0) { drawHorizon(view, c); } } else { //水平布局 if (position != 0) { drawVertical(view, c); } } } } } //画垂直分割线 private void drawVertical(View view, Canvas c) { int verticalDrawTop = view.getTop(); int verticalDrawLeft = view.getLeft() - verticalDivider; int verticalDrawRight = view.getLeft(); int verticalDrawBottom = view.getBottom(); paint.setColor(verticalDividererColor); drawDivider(c, verticalDrawLeft, verticalDrawTop, verticalDrawRight, verticalDrawBottom, paint); } //画水平分割线 private void drawHorizon(View view, Canvas c) { int horizonDrawTop = view.getTop() - horizonDivider; int horizonDrawLeft = view.getLeft(); int horizonDrawRight = view.getRight(); int horizonDrawBottom = view.getTop(); paint.setColor(horizonDividerColor); drawDivider(c, horizonDrawLeft, horizonDrawTop, horizonDrawRight, horizonDrawBottom, paint); } //画格子的水平分割线 private void drawGridHorizon(View view, Canvas c) { int horizonDrawTop = view.getTop() - horizonDivider; int horizonDrawLeft = view.getLeft() - verticalDivider; int horizonDrawRight = view.getRight(); int horizonDrawBottom = view.getTop(); paint.setColor(horizonDividerColor); drawDivider(c, horizonDrawLeft, horizonDrawTop, horizonDrawRight, horizonDrawBottom, paint); } /** * 划分割线 */ private void drawDivider(Canvas canvas, float left, float top, float right, float bottom, Paint paint) { if (drawable == null) { canvas.drawRect(left, top, right, bottom, paint); } else { Rect rect = new Rect((int) left, (int) top, (int) right, (int) bottom); drawable.setBounds(rect); drawable.draw(canvas); } } }
示例使用代码
/** * recycleview的工具 */ public class RecycleViewTool { /** * 水平方向 */ public static void setRecycleViewHorizonWithItemDecoration(Context context, RecyclerView recycleView, NewItemDecoration divider) { if (recycleView != null && recycleView != null) { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); setRecycleViewStyle(context, recycleView, linearLayoutManager, divider); } } public static void setRecycleViewHorizonal(Context context, RecyclerView recycleView) { setRecycleViewHorizonWithItemDecoration(context, recycleView, null); } /** * 垂直方向 */ public static void setRecycleViewVerticalWithItemDecoration(Context context, RecyclerView recycleView, NewItemDecoration divider) { if (recycleView != null && recycleView != null) { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); setRecycleViewStyle(context, recycleView, linearLayoutManager, divider); } } public static void setRecycleViewVertical(Context context, RecyclerView recycleView) { setRecycleViewVerticalWithItemDecoration(context, recycleView, null); } /** * 网格布局 */ public static void setRecycleViewGridWithItemDecoration(Context context, RecyclerView recycleView, NewItemDecoration divider, int colum) { if (recycleView != null && recycleView != null) { GridLayoutManager gridLayoutManager = new GridLayoutManager(context, colum); setRecycleViewStyle(context, recycleView, gridLayoutManager, divider); } } public static void setRecycleViewGrid(Context context, RecyclerView recycleView, int colum) { setRecycleViewGridWithItemDecoration(context, recycleView, null, colum); } /** * 标签流失布局 */ public static void setRecycleViewFlow(Context context, RecyclerView recycleView) { if (recycleView != null && recycleView != null) { FlowLayoutManager flowLayoutManager = new FlowLayoutManager(); setRecycleViewStyle(context, recycleView, flowLayoutManager, null); } } /** * 基本布局 */ public static void setRecycleViewStyle(Context context, RecyclerView recycleView, RecyclerView.LayoutManager layoutManager, NewItemDecoration divider) { if (context != null && recycleView != null) { if (layoutManager == null) { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recycleView.setLayoutManager(linearLayoutManager); } else { recycleView.setLayoutManager(layoutManager); } if (divider != null) { recycleView.addItemDecoration(divider); } } } }
NewItemDecoration decoration = new NewItemDecoration(5,30); decoration.setColor(0xffff00ff,0xff00ff00); RecycleViewTool.setRecycleViewGridWithItemDecoration(this, binding.rvList1, decoration,4); adapter = new RecycleViewDividerAdapter(this); adapter.addData(list); binding.rvList1.setAdapter(adapter);
NewItemDecoration decoration = new NewItemDecoration(5); decoration.setColor(0xffff00ff); RecycleViewTool.setRecycleViewHorizonWithItemDecoration(this, binding.rvList1, decoration); adapter = new RecycleViewDividerAdapter(this); adapter.addData(list); binding.rvList1.setAdapter(adapter);
NewItemDecoration decoration = new NewItemDecoration(5); // decoration.setDrawable(R.drawable.shape_divider, this); RecycleViewTool.setRecycleViewGridWithItemDecoration(this, binding.rvList1, decoration,4); adapter = new RecycleViewDividerAdapter(this); adapter.addData(list); binding.rvList1.setAdapter(adapter);
如果有什么错误不足之处,请谅解