本文实现的吸顶效果为:
简介
我们都知道 ListView 添加分割线可以通过在布局文件中添加 android:divider 属性即可,但是 RecyclerView 并没有提供那样的属性。如若需要使用分割线,则需要使用其他的方式实现:
给 RecyclerView item 设置 margin : 首先将布局文件中的 RecyclerView 背景设置成分割线的颜色(如黑色),itemView 的背景颜色设置成白色,然后在 onCreateViewHolder() 中为 itemView 设置 top / bottom margin;
<!--布局文件--> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000" />
// RecyclerAdapter.java @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = inflater.inflate(R.layout.item_recycler_view, parent, false); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) itemView.getLayoutParams(); layoutParams.bottomMargin = 50; // 为方便观察,设置一个很大的间距 itemView.setLayoutParams(layoutParams); return new ItemViewHolder(itemView); }
可以看到上面效果图:这种实现方式第一个 item 或者 最后一个 item(如上图 最后一个 item) 都会存在 分割线。同时也会增加不必要的背景设置,从而导致过度绘制。
. 2 自定义 ItemDecoration;
RecyclerView.ItemDecoration 的使用主要涉及到以下三个函数:
void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state)
void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state)
ItemDecoration 实现常规分割线
一般的,对于列表添加分割线,第一个 itemView 顶部和最后一个 itemView 底部是不需要分割线的,以下代码实现这种效果。
继承自 RecyclerView.ItemDecoration 类,在 onDraw() 中给 itemView 的顶部绘制一个矩形,第一个 itemView 没有绘制(我们通过 getChildAdapterPosition() 方法获取第 1 个 itemView 的索引,而不是直接使用 for 循环中的 i = 0,因为 i=0 是表示当前屏幕中第一个可见的 itemView 的索引)
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final String TAG = "DividerItemDecoration";
private Context context;
private int dividerHeight;
private int dividerPaddingLeft;
private int dividerPaddingRight;
private Paint paint;
public DividerItemDecoration(Context context) {
this.context = context;
dividerHeight = dp2Px(20);
dividerPaddingLeft = dp2Px(10);
dividerPaddingRight = dp2Px(10);
initPaint();
}
private void initPaint() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(context.getResources().getColor(R.color.colorAccent));
paint.setStyle(Paint.Style.FILL);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
// 不是第一个 item 才设置 top
if (parent.getChildAdapterPosition(view) != 0) {
outRect.top = dividerHeight;
}
Log.d(TAG, "getItemOffsets: left = " + outRect.left + ",top = " +