RecyclerView ItemDecoration 实现分组吸顶效果

本文介绍了如何在RecyclerView中实现分组吸顶效果,包括使用ItemDecoration添加常规分割线和实现吸顶效果的详细步骤,同时提供了完整代码示例。
摘要由CSDN通过智能技术生成

本文实现的吸顶效果为:

简介

我们都知道 ListView 添加分割线可以通过在布局文件中添加 android:divider 属性即可,但是 RecyclerView 并没有提供那样的属性。如若需要使用分割线,则需要使用其他的方式实现:

  1. 给 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 = " + 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值