RecyclerView 到达顶部的另一种方式

RecyclerView 到达顶部的条件有很多种,除了Scroll外,很多都要和LayoutManager的具体类型相关。

特别的,但第一个item的height为0的时候,canScrollVertically的判断就会出错。


这里提出一种和具体类型无关的,并能避免height为0时出现错误的方法:

    private static Rect InsertRect = new Rect();

    private static boolean canScrollVertically(RecyclerView view, int direction) {
        if (direction < 1) {
            if (view.getChildCount() > 0) {
                // 获取第一个View
                View child = view.getChildAt(0);
                if (child != null && view.getChildAdapterPosition(child) == 0) {
                    // 这个view是否是第0个item
                    RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                    RecyclerView.LayoutManager layoutManager = view.getLayoutManager();
                    if (layoutManager != null && layoutParams != null) {
                       // 获得ItemDecorations中的偏移
                        layoutManager.calculateItemDecorationsForChild(child, InsertRect);

                        // 第一个View的top修正偏移和margin后的实际位置  
                        int top = child.getTop() - InsertRect.top - layoutParams.topMargin;
                        return top < 0; // >= 0 到顶
                    }
                }
            }
        }

        return view.canScrollVertically(direction);
    }



原理就是当第一个View是第0项,并且view的top在偏移和margin修正后 >= 0就到达顶端了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值