最近项目多次用到了RecyclerView,有时候是LinearLayoutManager, 有时候是GridLayoutManager, 或者StraggeredGridLayoutMananger,在定制分割线的时候,最初是一种layoutManager,或者一种分割线样式就给写个类,后面有时间才整理出,适用于各种layoutManager,和各种样式分割线 的万能分割线。
代码如下:
package com.XXX.XXX.mubanapplication.ui.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import com.example.xxx.mubanapplication.help_class.ContextHelper;
/**
* Created by XXXX on 2017/4/19.
*/
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable mDivider;
private int size;
private Paint mPaint;
/**
* 默认分割线:高度为2px,颜色为灰色
*
* @param context
*/
public DividerGridItemDecoration(Context context) {
if (mDivider == null) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
}
}
public DividerGridItemDecoration(Context context, int drawableId) {
mDivider = ContextHelper.getDrawable(drawableId);
size = mDivider.getIntrinsicHeight();//根据朝向,获取宽或者高
}
public DividerGridItemDecoration(Context context, int drawableId, int dividerColor) {
mDivider = ContextHelper.getDrawable(drawableId);
size = mDivider.getIntrinsicHeight();//根据朝向,获取宽或者高
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(ContextHelper.getColor(dividerColor));
mPaint.setStyle(Paint.Style.FILL);
}
/*
* @param size:The width or height of divider
* */
public void setSize(int value) {
size = value;
}
public void setOrientation(int value) {
size = value;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
drawHorizontal(c, parent);
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
private int getSpanCount(RecyclerView parent) {
// 列数
int spanCount = -1;
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
spanCount = ((StaggeredGridLayoutManager) layoutManager)
.getSpanCount();
}
return spanCount;
}
//画水平线
public void drawHorizontal(Canvas c, RecyclerView parent) {
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.getLeft() - params.leftMargin;
final int right = child.getRight() + params.rightMargin + size;
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + size;
if (mDivider != null) {
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
if (mPaint != null) {
c.drawRect(left, top, right, bottom, mPaint);
}
}
}
//画竖线
public void drawVertical(Canvas c, RecyclerView parent) {
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.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
final int left = child.getRight() + params.rightMargin;
final int right = left + size;
if (mDivider != null) {
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
if (mPaint != null) {
c.drawRect(left, top, right, bottom, mPaint);
}
}
}
private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
int childCount) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
if ((pos + 1) % spanCount == 0) {// 如果是最后一列,则不需要绘制右边
return true;
}
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
int orientation = ((StaggeredGridLayoutManager) layoutManager)
.getOrientation();
if (orientation == StaggeredGridLayoutManager.VERTICAL) {
if ((pos + 1) % spanCount == 0) {// 如果是最后一列,则不需要绘制右边
return true;
}
} else {
childCount = childCount - childCount % spanCount;
if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
return true;
}
}
return false;
}
private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
int childCount) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
// childCount = childCount - childCount % spanCount;
if (pos >= childCount - spanCount)// 如果是最后一行,则不需要绘制底部
return true;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
int orientation = ((StaggeredGridLayoutManager) layoutManager)
.getOrientation();
// StaggeredGridLayoutManager 且纵向滚动
if (orientation == StaggeredGridLayoutManager.VERTICAL) {
childCount = childCount - childCount % spanCount;
// 如果是最后一行,则不需要绘制底部
if (pos >= childCount - spanCount)// 如果是最后一行,则不需要绘制底部
return true;
} else {// StaggeredGridLayoutManager 且横向滚动
// 如果是最后一行,则不需要绘制底部
if ((pos + 1) % spanCount == 0) {
return true;
}
}
} else {
if (pos == childCount - 1) {
return true;
}
}
return false;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
int itemPosition = parent.getChildAdapterPosition(view);
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
if (isLastRaw(parent, itemPosition, spanCount, childCount)) {// 如果是最后一行,则不需要绘制底部
if (isLastColum(parent, itemPosition, spanCount, childCount)) {//最后一个
outRect.set(0, 0, 0, 0);
} else {
outRect.set(0, 0, size, 0);
}
} else if (isLastColum(parent, itemPosition, spanCount, childCount)) {// 如果是最后一列,则不需要绘制右边
outRect.set(0, 0, 0, size);
} else {
outRect.set(0, 0, size, size);
}
} else {
if (isLastRaw(parent, itemPosition, spanCount, childCount)) {// 如果是最后一行,则不需要绘制右边
outRect.set(0, 0, 0, 0);
} else {
outRect.set(0, 0, 0, size);
}
}
}
}
Activity的XML代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.haoyuban111.mubanapplication.ui.activity.ActivityFirst">
<include layout="@layout/layout_header" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="11dp"
android:layout_marginLeft="11dp"
android:layout_marginRight="11dp"
android:layout_marginBottom="11dp"
android:layout_weight="1" />
<include
android:id="@+id/viewBottom"
layout="@layout/layout_bottom" />
</LinearLayout>
Activity中代码:
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
GridLayoutManager layoutManager = new GridLayoutManager(ContextHelper.getApplicationContext(), 2);
DividerGridItemDecoration decoration = new DividerGridItemDecoration(ContextHelper.getApplicationContext(), R.drawable.divider, R.color.yellow);
decoration.setSize(20);
recyclerView.addItemDecoration(decoration);
recyclerView.setLayoutManager(layoutManager);
divider.xml代码:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/blue" />
<size android:height="10dp" />
</shape>
ContextHelper中几个方法,也贴上吧
public static int getColor(int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return ContextHelper.getApplicationContext().getResources().getColor(id, getApplicationContext().getTheme());
} else {
return ContextHelper.getApplicationContext().getResources().getColor(id);
}
}
public static String getString(int id) {
return getApplicationContext().getString(id);
}
public static Drawable getDrawable(int drawableId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return ContextHelper.getApplicationContext().getResources().getDrawable(drawableId, getApplicationContext().getTheme());
} else {
return ContextHelper.getApplicationContext().getResources().getDrawable(drawableId);
}
}
效果如下: