垂直Recyclerview嵌套水平Recyclerview滑动

2018-12-25  本文已影响0人  InvictusGar

参考

http://blog.devwiki.net/index.php/2016/06/13/RecyclerView-Scroll-Listener.html

垂直Recyclerview嵌套水平Recyclerview的时候,有时候水平滑动的事件会被垂直的View消费掉,这时候横划就会比较困难。

解决方案
主要:https://www.jianshu.com/p/4c87e0b6d16c

http://lruheng.com/2018/03/14/ScrollView%E5%B5%8C%E5%A5%97RecyclerView%E6%BB%91%E5%8A%A8%E5%86%B2%E7%AA%81%E7%9B%B8%E5%85%B3%E9%97%AE%E9%A2%98/

http://freedomofme.github.io/%E5%BC%80%E5%8F%91/%E5%A4%9A%E9%87%8D%E5%B5%8C%E5%A5%97%E5%B8%83%E5%B1%80%E4%B8%8B%E6%BB%91%E5%8A%A8%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E5%92%8C%E6%80%9D%E8%B7%AF/

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        float x = e.getRawX();
        float y = e.getRawY();

        switch (e.getAction()) {
            case MotionEvent.ACTION_DOWN:
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                float dealtX = Math.abs(x - lastX);
                float dealtY = Math.abs(y - lastY);
                if (dealtX > 1f || dealtY > 1f) {
                    if (dealtY < dealtX * mRatio) {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                }
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }
    }

注意:使用上面的方法后,滑动到RecyclerView到最后一个item时,仍然会由子View处理事件,因此,不会响应父View的事件;

这时候可以通过如下方法,在dispatchTouchEvent方法中去获得第一项和最后一项,让子View释放处理

https://www.jianshu.com/p/5eb2de368ea0

相关学习:

https://www.jianshu.com/p/7e92121814ed

https://blog.csdn.net/yulyu/article/details/59056609

上一篇 下一篇

猜你喜欢

热点阅读