Android RecyclerView(四)设置分割线样式(Android 5.0 新特性)
样式一
在这里,其实是设置了每一个 条目布局中的子布局的android:layout_margin = “1dp”
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent" >
<LinearLayout android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:background = "#fff"
android:orientation = "vertical" >
<TextView android:id = "@+id/tv_item_text"
android:layout_width = "match_parent"
android:layout_height = "80dp"
android:layout_margin = "1dp"
android:background = "#acd972"
android:gravity = "center" />
</LinearLayout >
</RelativeLayout >
样式二
在这里,没有设置条目布局中的子布局的android:layout_margin = “1dp”,加载出来默认的样式,是没有分割线的效果的
1 设置分割线 相对简单 利用了系统默认的样式
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_list);
//设置布局样式
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//设置方向
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//关联RecyclerView
recyclerView.setLayoutManager(linearLayoutManager);
//设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(
this, DividerItemDecoration.VERTICAL));
2 设置分割线 相对简单而暴力的方法
2.1 定义 RecyclerView.ItemDecoration 子类
class RecycleViewDivider extends RecyclerView.ItemDecoration {
/**
*
* @param outRect 边界
* @param view recyclerView ItemView
* @param parent recyclerView
* @param state recycler 内部数据管理
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
/**
* public void set(int left, int top, int right, int bottom)
* 设定底部边距为10px
*/
outRect.set(0, 0,0, 10);
}
}
2.2 在 RecyclerView 中使用
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_list);
//设置布局样式
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置分割线
recyclerView.addItemDecoration(new RecycleViewDivider());
3 设置分割线 相对比较人性化的方法
使用这种方法的基本逻辑是 绘制分割线,然后再设置分割线的大小
效果
3.1 定义样式
class RecycleViewDivider2 extends RecyclerView.ItemDecoration {
/**
* RecyclerView的布局方向,默认先赋值
* 为纵向布局
* RecyclerView 布局可横向,也可纵向
* 横向和纵向对应的分割想画法不一样
*/
private int mOrientation = LinearLayoutManager.VERTICAL;
/**
* item之间分割线的size,默认为1
*/
private int mItemSize = 2;
/**
* 绘制item分割线的画笔,和设置其属性
* 来绘制个性分割线
*/
private Paint mPaint;
/**
* 构造方法传入布局方向,不可不传
*
* @param context
* @param orientation
*/
public RecycleViewDivider2 (Context context, int orientation) {
//样式的方向
this.mOrientation = orientation;
if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) {
throw new IllegalArgumentException("请传入正确的参数");
}
//转换
mItemSize = (int) TypedValue.applyDimension(mItemSize, TypedValue.COMPLEX_UNIT_DIP, context.getResources().getDisplayMetrics());
//创建画笔
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
//设置画笔颜色
mPaint.setColor(Color.BLUE);
/**
* 设置画笔模式
*/
mPaint.setStyle(Paint.Style.FILL);
}
//绘制
@Override
public void onDraw (Canvas c, RecyclerView parent, State state) {
if(mOrientation == LinearLayoutManager.VERTICAL){
drawVertical(c,parent) ;
}else {
drawHorizontal(c,parent) ;
}
}
/**
* 绘制纵向 item 分割线
* @param canvas
* @param parent
*/
private void drawVertical(Canvas canvas,RecyclerView parent){
final int left = parent.getPaddingLeft() ;
final int right = parent.getMeasuredWidth() - parent.getPaddingRight() ;
final int childSize = parent.getChildCount() ;
for(int i = 0 ; i < childSize ; i ++){
final View child = parent.getChildAt( i ) ;
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + layoutParams.bottomMargin ;
final int bottom = top + mItemSize ;
canvas.drawRect(left,top,right,bottom,mPaint);
}
}
/**
* 绘制横向 item 分割线
* @param canvas
* @param parent
*/
private void drawHorizontal(Canvas canvas,RecyclerView parent){
final int top = parent.getPaddingTop() ;
final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom() ;
final int childSize = parent.getChildCount() ;
for(int i = 0 ; i < childSize ; i ++){
final View child = parent.getChildAt( i ) ;
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + layoutParams.rightMargin ;
final int right = left + mItemSize ;
canvas.drawRect(left,top,right,bottom,mPaint);
}
}
//设置大小
@Override
public void getItemOffsets (Rect outRect, View view, RecyclerView parent, State state) {
if(mOrientation == LinearLayoutManager.VERTICAL){
outRect.set(0,0,0,mItemSize);
}else {
outRect.set(0,0,mItemSize,0);
}
}
}
3.2 设置样式
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_list);
//设置布局样式
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//设置方向
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//关联RecyclerView
recyclerView.setLayoutManager(linearLayoutManager);
//设置分割线
recyclerView.addItemDecoration(new RecycleViewDivider2(this,linearLayoutManager.getOrientation()));