RecyclerView是增强版的ListView,可以很容易实现侧滑删除和拖拽功能。但是RecyclerView得Item之间的分割线设置却没有ListView那么简单。
ListView分割线设置如下:
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@drawable/item_divider"
android:dividerHeight="10dp"/>
RecyclerView没有提供divider和dividerHeight两个属性。只提供了RecyclerView.ItemDecoration这个内部类,我们要自定义一个类继承此类。实现RecyclerView的分割线。
自定义的ItemDivider
package com.wowsai.www.progresswebview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.LinearLayout;
/**
* Created by Administrator on 2017/1/18.
*/
public class MyItemDivider extends RecyclerView.ItemDecoration {
//画笔,用来绘制分割线
private Paint paint;
private Context context;
//recyclerView的布局方向:水平或者垂直
private int orientation;
//分割线的高度
private int dividerHeight;
//分割线可以是drawable对象
private Drawable divider;
public MyItemDivider(Context context, int orientation) {
//如果方向不是水平或垂直的,抛出异常
if (orientation != LinearLayout.VERTICAL && orientation != LinearLayout.HORIZONTAL) {
throw new IllegalArgumentException("the layoutManager of RecyclerView must be " +
"LinearLayoutManager");
}
this.context = context;
this.orientation = orientation;
}
//自定义分割线的高度和颜色
public MyItemDivider(Context context, int orientation, int dividerHeight, int dividerColor) {
this(context, orientation);
this.dividerHeight = dividerHeight;
initPaint(dividerColor);
}
//自定义drawable分割线
public MyItemDivider(Context context, int orientation, Drawable divider) {
this(context, orientation);
this.divider = divider;
}
private void initPaint(int dividerColor) {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(dividerColor);
paint.setStyle(Paint.Style.FILL);
}
//获得Item的偏移量
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State
state) {
super.getItemOffsets(outRect, view, parent, state);
//水平布局,每个item向右偏移dividerHeight
if (orientation == LinearLayout.HORIZONTAL) {
outRect.set(0, 0, dividerHeight, 0);
}
//垂直布局,每个item向下偏移dividerHeight
else if (orientation == LinearLayout.VERTICAL) {
outRect.set(0, 0, 0, dividerHeight);
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
if (orientation == LinearLayout.HORIZONTAL) {
drawHorizontalDivider(c, parent);
} else if (orientation == LinearLayout.VERTICAL) {
drawVerticalDivider(c, parent);
}
}
//根据方向和分割线高度算出分割线的位置,用画笔划出来
private void drawHorizontalDivider(Canvas canvas, RecyclerView recyclerView) {
int top = recyclerView.getPaddingTop();
int bottom = recyclerView.getHeight() - recyclerView.getPaddingRight();
int count = recyclerView.getChildCount();
for (int i = 0; i < count; i++) {
View child = recyclerView.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child
.getLayoutParams();
int left = child.getRight() + layoutParams.rightMargin;
int right = left + dividerHeight;
if (divider != null) {
divider.setBounds(left, top, right, bottom);
divider.draw(canvas);
} else if (paint != null) {
canvas.drawRect(left, top, right, bottom, paint);
}
}
}
private void drawVerticalDivider(Canvas canvas, RecyclerView recyclerView) {
int left = recyclerView.getPaddingLeft();
int right = recyclerView.getWidth() - recyclerView.getPaddingRight();
int count = recyclerView.getChildCount();
for (int i = 0; i < count; i++) {
View child = recyclerView.getChildAt(i);
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child
.getLayoutParams();
int top = child.getBottom() + layoutParams.bottomMargin;
int bottom = top + dividerHeight;
if (divider != null) {
divider.setBounds(left, top, right, bottom);
divider.draw(canvas);
} else if (paint != null) {
canvas.drawRect(left, top, right, bottom, paint);
}
}
}
}
使用:
布局文件:
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
activity代码:
package com.wowsai.www.progresswebview;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
public class Main5Activity extends AppCompatActivity {
private RecyclerView mRecyclerView;
//模拟数据
private List<String> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5);
initData();
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//设置布局管理器,必要操作
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayout
.VERTICAL, false);
mRecyclerView.setLayoutManager(linearLayoutManager);
//设置自定义item分割线,高度15px,颜色灰色
mRecyclerView.addItemDecoration(new MyItemDivider(this, LinearLayout.VERTICAL, 15, Color
.GRAY));
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, data);
mRecyclerView.setAdapter(adapter);
}
private void initData() {
data = new ArrayList<>();
for (int i = 0; i < 50; i++) {
data.add("数据====" + i);
}
}
}