RecyclerView自定义分割线轻松解决多条目分割问题。美工给出如下效果图,需要用RecyclerView写。
思路:在制定Item下面添加一个10dp的距离。并且添加背景颜色。
1.0自定义分割线的位置和大小和颜色
public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration {
private Paint mPaint;
private int size;
public RecyclerViewItemDecoration(int size) {
this.size = size;
//初始化画笔
mPaint = new Paint();
//抗锯齿
mPaint.setAntiAlias(true);
//颜色设置为黑色lightGray2_color
mPaint.setColor(ContextCompat.getColor(SystemUtil.getApplication(), R.color.azarin_color));
}
/**
* 基本操作是留出分割线位置
*
* @param outRect
* @param view
* @param parent
* @param state
*/
// @Override
// public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State
// state) {
// //获取条目
// int position = parent.getChildAdapterPosition(view);
// //如果不是第一个条目,每个条目上方预留10px位置用来绘制分割线
// if (position != 0) {
// outRect.top = 10;
// }
// }
/**
* 绘制分割线
*
* @param parent
* @param state
*/
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
Rect mRect = new Rect();
//设置矩形左边位置
mRect.left = parent.getPaddingLeft();
//设置矩形右边位置
mRect.right = parent.getWidth() - parent.getPaddingRight();
int chilCount = parent.getChildCount();
for (int i = 1; i < chilCount; i++) {
//每个分割线的底部位置都是上一个条目的头部
mRect.bottom = parent.getChildAt(i).getBottom();
//每个分割线的头部位置都是底部位置-10px
mRect.bottom = mRect.bottom + size;
canvas.drawRect(mRect, mPaint);
}
}
}
2.0在Activity使用
SettingsAdapter settingsAdapter = new SettingsAdapter(this);
settingsRecyclerView.setAdapter(settingsAdapter);
//条目高度dp转为px
int i = DensityUtils.dp2px(this, 10);
//使用分割线
settingsRecyclerView.addItemDecoration(settingsAdapter.getItemDecoration(i));
LinearLayoutManager linearLayout = new LinearLayoutManager(SystemUtil.getApplication());
settingsRecyclerView.setLayoutManager(linearLayout);
3.0
在adapter中在指定位置使用分割线,
public RecyclerViewItemDecoration getItemDecoration(final int size) {
return new RecyclerViewItemDecoration(size){
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State
state) {
//获取条目
int position = parent.getChildAdapterPosition(view);
//如果不是第一个条目,每个条目上方预留10px位置用来绘制分割线
if (position == 1 || position == 4 || position == (getItemCount() - 1)) {
outRect.bottom = size;
}
}
};
}