PtrFrameLayout 上下拉控件刷新空间 里面的item嵌套一个横向滑动的RecyclerView,我重写了RecyclerView但是事件还是有冲突。请各位朋友帮助,有偿解决此问题 Q 416760980

解决方案 »

  1.   

    自定义PtrHandler,在RecyclerView横向滑动时,设置不可下拉刷新。大致代码public abstract class TouchPtrHandler implements PtrHandler{    /**
         * 手动设置是否可用下拉刷新
         */
        private boolean canScrollUp = true;    /**
         * 手动设置是否可用下拉刷新
         * @param canScrollUp true则可下拉刷新,false则不可下拉刷新
         */
        public void setCanScrollUp(boolean canScrollUp) {
            this.canScrollUp = canScrollUp;
        }    @Override
        public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
            return canScrollUp && PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
        }
    }在RecyclerView的事件中进行判断,如果横向滑动大于竖向滑动时这设置canScrollUp为false,部分代码        private static final float minXlength = 20;
            private float startX, startY;
            /** 是锁定状态 */
            private boolean isLockStatus = false;
            /** 是否可下拉(纵向下拉距离超过横向滑动距离且纵向下拉超过一定距离才判断为下拉状态,否则判定位滑动状态) */
            private boolean disableScroll = false;
           @Override
            public void dispatchTouchEvent(MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = event.getX();
                        startY = event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (!isLockStatus) {
                            float xGap = Math.abs(event.getX() - startX);
                            float yGap = Math.abs(event.getY() - startY);
                            if (xGap > yGap && xGap > minXlength){
                                disableScroll = false;
                                isLockStatus = true;
                            } else if (yGap > xGap && yGap >minXlength) {
                                disableScroll = true;
                                isLockStatus = true;
                            }
                        }
                        final TouchPtrHandler refreshLayout = touchPtrFrameLayout.get();
                        if (refreshLayout != null) {
                            refreshLayout.setCanScrollUp(disableScroll);
                        }
                        if (disableScroll && getParent() != null) {
                            getParent().requestDisallowInterceptTouchEvent(true);
                        }
                        break;
                    case MotionEvent.ACTION_CANCEL:
                    default:
                        isLockStatus = false;
                        disableScroll = false;
                        final TouchPtrHandler cancelRefreshLayout = touchPtrFrameLayout.get();
                        if (cancelRefreshLayout != null) cancelRefreshLayout.setCanScrollUp(true);
                        break;
                }
            }