最近尝试自己使用了一下RecyclerView,在设置分割线的时候,需要自己继承ItemDerocation类,并重写onDraw()和getItemOffets()方法。效果如下图:
白色的选项框就是用recyclerView实现的。
下面贴出ItemDecoration的代码:
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[] {
android.R.attr.listDivider
//使用的是系统内置的分割线
};
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
private Drawable mDivider;
private int mOriention;
public DividerItemDecoration(Context context, int oriention) {
final TypedArray typedArray = context.obtainStyledAttributes(ATTRS);
mDivider = typedArray.getDrawable(0);
typedArray.recycle();//必须用recycle()回收,否则会对下次属性设置产生影响。
setOriention(oriention);
}
public void setOriention(int oriention) {
if (oriention != VERTICAL_LIST && oriention != HORIZONTAL_LIST ) {
throw new IllegalArgumentException("invalid oriention");
}
mOriention = oriention;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
if (mOriention == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
//再把横向分割写了,虽然用不到
drawHorizontal(c, parent);
}
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingRight();
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;
final int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left,top,right,bottom);
mDivider.draw(c);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
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;
Log.d("params.bottomMargin", "" + params.bottomMargin);
Log.d("child.getBottom()", "第" + i+ "个" + child.getBottom());
/*这里想查明child.getBottom()和params.bottomMargin是如何取值的。logo显示,getBottom应该显示的是每个item底部到屏幕顶部的距离;bottomMargin取值都是0,所以不好判断*/
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left,top, right, bottom);
mDivider.draw(c);
}
}
//这个函数设置分割线的绘制范围。
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (mOriention == VERTICAL_LIST) {
outRect.set(0,0,0,mDivider.getIntrinsicHeight());
} else {
outRect.set(0,0,mDivider.getIntrinsicWidth(),0);
}
}
}
查阅资料,发现,可以自定义分割线样式
现在stytle中设置新的android:listDivider值:
@drawable/divider_bg
然后,在drawable中创建一个divider_bg: