/**
* @time: 2019/2/28 0028 下午 16:35
* @author:lst
* @Description: 分割线 自定义 颜色,位置
*/
public class LinearDividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int LINEAR_DIVIDER_HORIZONTAL = LinearLayoutManager.HORIZONTAL;
public static final int LINEAR_DIVIDER_VERTICAL = LinearLayoutManager.VERTICAL;
private final SparseIntArray mDividerOffsets = new SparseIntArray();
private final SparseArray<DrawableCreator> mTypeDrawableFactories = new SparseArray<>();
@IntDef({
LINEAR_DIVIDER_HORIZONTAL,
LINEAR_DIVIDER_VERTICAL
})
@Retention(RetentionPolicy.SOURCE)
private @interface Orientation {
}
@Orientation
private int mOrientation;
private Drawable mDivider;
private boolean top = false;
public LinearDividerItemDecoration(@Orientation int orientation, Drawable mDivider, boolean top) {
this.mDivider = mDivider;
setOrientation(orientation);
this.top = top;
}
public LinearDividerItemDecoration(@Orientation int orientation, Drawable mDivider) {
this.mDivider = mDivider;
setOrientation(orientation);
}
public void setOrientation(@Orientation int orientation) {
mOrientation = orientation;
}
public void setDivider(Drawable divider) {
this.mDivider = divider;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == LINEAR_DIVIDER_VERTICAL) {
drawVerticalDividers(c, parent);
} else {
drawHorizontalDividers(c, parent);
}
}
public void drawVerticalDividers(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
if (this.top) {
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final Drawable divider = getDivider(parent, params.getViewAdapterPosition());
final int bottom = child.getTop() - params.topMargin - Math.round(child.getTranslationY());
final int top = bottom - divider.getIntrinsicHeight();
mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight());
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}else {
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final Drawable divider = getDivider(parent, params.getViewAdapterPosition());
final int top = child.getBottom() + params.bottomMargin + Math.round(child.getTranslationY());
final int bottom = top + divider.getIntrinsicHeight();
mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight());
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
}
public void drawHorizontalDividers(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
if (this.top) { // 左边
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final Drawable divider = getDivider(parent, params.getViewAdapterPosition());
final int right = child.getLeft() - params.leftMargin - Math.round(child.getTranslationX());
final int left = right - divider.getIntrinsicHeight();
mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight());
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
} else {
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final Drawable divider = getDivider(parent, params.getViewAdapterPosition());
final int left = child.getRight() + params.rightMargin + Math.round(child.getTranslationX());
final int right = left + divider.getIntrinsicHeight();
mDividerOffsets.put(params.getViewAdapterPosition(), divider.getIntrinsicHeight());
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
final int adapterPosition = parent.getChildAdapterPosition(view);
if (top) {
if (mDividerOffsets.indexOfKey(adapterPosition) < 0) {
mDividerOffsets.put(adapterPosition, getDivider(parent, adapterPosition).getIntrinsicHeight());
}
if (mOrientation == LINEAR_DIVIDER_VERTICAL) {
outRect.set(0, mDividerOffsets.get(parent.getChildAdapterPosition(view)), 0, 0);
} else {
outRect.set(mDividerOffsets.get(parent.getChildAdapterPosition(view)), 0, 0, 0);
}
} else {
if (adapterPosition == parent.getAdapter().getItemCount() - 1) {
return;
}
if (mDividerOffsets.indexOfKey(adapterPosition) < 0) {
mDividerOffsets.put(adapterPosition, getDivider(parent, adapterPosition).getIntrinsicHeight());
}
if (mOrientation == LINEAR_DIVIDER_VERTICAL) {
outRect.set(0, 0, 0, mDividerOffsets.get(parent.getChildAdapterPosition(view)));
} else {
outRect.set(0, 0, mDividerOffsets.get(parent.getChildAdapterPosition(view)), 0);
}
}
}
private Drawable getDivider(RecyclerView parent, int adapterPosition) {
final RecyclerView.Adapter adapter = parent.getAdapter();
final int itemType = adapter.getItemViewType(adapterPosition);
final DrawableCreator drawableCreator = mTypeDrawableFactories.get(itemType);
if (drawableCreator != null) {
return drawableCreator.create(parent, adapterPosition);
}
return mDivider;
}
public void registerTypeDrawable(int itemType, DrawableCreator drawableCreator) {
mTypeDrawableFactories.put(itemType, drawableCreator);
}
public interface DrawableCreator {
Drawable create(RecyclerView parent, int adapterPosition);
}
}
附上详细解析
https://blog.youkuaiyun.com/carson_ho/article/details/75004649
本文介绍了一种自定义RecyclerView中分割线的方法,包括颜色、位置的定制,适用于垂直和水平方向。通过LinearDividerItemDecoration类,可以灵活设置分割线的位置(顶部或底部),并为不同类型的item提供不同的分割线。
4127

被折叠的 条评论
为什么被折叠?



