RecyclerView自定义分割线
排列方式:
- 水平排列分割线
- 垂直排列分割线
设置属性:
- 是否最后一条显示分割线
- 设置分割线宽(高)度
- 设置左右间距
- 设置左间距
- 设置右间距
- 通过资源id设置左间距
- 设置颜色
设置属性代码:
/**
* 是否最后一条显示分割线
* @param show
* @return
*/
public Builder setmShowLastLine(boolean show) {
this.mShowLastLine = show;
return this;
}
/**
* 设置分割线宽(高)度
* @param pixels
* @return
*/
public Builder setSpan(float pixels) {
mSpanSpace = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pixels, mResources.getDisplayMetrics());
return this;
}
/**
* 设置分割线宽(高)度
* @param resource
* @return
*/
public Builder setSpan(@DimenRes int resource) {
mSpanSpace = mResources.getDimensionPixelSize(resource);
return this;
}
/**
* 设置左右间距
* @param pixels
* @return
*/
public Builder setPadding(float pixels) {
setLeftPadding(pixels);
setRightPadding(pixels);
return this;
}
/**
* 设置左右间距
* @param resource
* @return
*/
public Builder setPadding(@DimenRes int resource) {
setLeftPadding(resource);
setRightPadding(resource);
return this;
}
/**
* 设置左间距
* @param pixelPadding
* @return
*/
public Builder setLeftPadding(float pixelPadding) {
mLeftPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pixelPadding, mResources.getDisplayMetrics());
return this;
}
/**
* 设置右间距
* @param pixelPadding
* @return
*/
public Builder setRightPadding(float pixelPadding) {
mRightPadding=(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pixelPadding, mResources.getDisplayMetrics());
return this;
}
/**
* 通过资源id设置左间距
* @param resource
* @return
*/
public Builder setLeftPadding(@DimenRes int resource) {
mLeftPadding = mResources.getDimensionPixelSize(resource);
return this;
}
/**
* 通过资源id设置左间距
* @param resource
* @return
*/
public Builder setRightPadding(@DimenRes int resource) {
mRightPadding = mResources.getDimensionPixelSize(resource);
return this;
}
/**
* 通过资源id设置颜色
* @param resource
* @return
*/
@SuppressLint("ResourceType")
public Builder setColorResource(@ColorRes int resource) {
setColor(ContextCompat.getColor(mContext, resource));
return this;
}
/**
* 设置颜色
* @param color
* @return
*/
public Builder setColor(@ColorRes int color) {
mColor = color;
return this;
}
排列方式:
/**
* 画水平排列分割线
* @param c
* @param parent
*/
private void drawHorizontal(Canvas c, RecyclerView parent) {
final int top=parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightMargin + Math.round(ViewCompat.getTranslationX(child));
final int right = left + mSpanSpace;
int count = mShowLastLine ? parent.getAdapter().getItemCount() : parent.getAdapter().getItemCount() - 1;
if (i < count) {
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
/**
* 画垂直排列分割线
* @param c
* @param parent
*/
private void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft() + mLeftPadding;
final int right = parent.getWidth() - parent.getPaddingRight() - mRightPadding;
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params= (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin + Math.round(ViewCompat.getTranslationY(child));
final int bottom=top+mSpanSpace;
int count = mShowLastLine ? parent.getAdapter().getItemCount() : parent.getAdapter().getItemCount() - 1;
if (i < count) {
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
} else {
mDivider.setBounds(left,top,right,top);
mDivider.draw(c);
}
}
}
绘画分割线:
/**
* item是否是垂直排列
* @param parent
* @return
*/
private boolean isVertical(RecyclerView parent) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
int orientation=((LinearLayoutManager)layoutManager).getOrientation();
return orientation == LinearLayoutManager.VERTICAL;
}
return false;
}
@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
if (isVertical(parent)) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
设置分割线:
LinearItemDecoration linearItemDecoration = new LinearItemDecoration.Builder(mContext)
.setSpan(1f)
.setColorResource(R.color.gray_selector)
.setmShowLastLine(true)
.build();
recyclerView.addItemDecoration(linearItemDecoration);
完整代码:
链接:https://pan.baidu.com/s/1GH-oHsz9H4zQxXR6PE2FJw
提取码:hw0i
复制这段内容后打开百度网盘手机App,操作更方便哦