1. 程式人生 > >全網唯一有用的解決方案!徹底解決VerticalViewPager巢狀RecyclerView引起的滑動衝突!

全網唯一有用的解決方案!徹底解決VerticalViewPager巢狀RecyclerView引起的滑動衝突!

首先承認標題的確很裝13,但是這樣做是為了引起大家注意,真正去解決大家的問題。因為這個問題無論我百度或者Google,都沒有找到可行的解決方案。

本人用的VerticalViewPager是GitHub上的castorflex/VerticalViewPager。

我在用VerticalViewPager裡嵌套了兩個fragment,frg1和frg2,其中frg1有RecyclerView,frg2有水平滑動的ViewPager,水平滑動的ViewPager裡包含了RecyclerView。

frg1                                              frg2

好了廢話不多說,直接說明問題,當我從frg1上翻滑動到下面的frg2的時候,是OK的。但是當我從frg2下拉滑動到上面的frg1的時候,滑動事件被攔截,無法滑動,我進行了無數嘗試,一直企圖從RecyclerView入手,可是沒有任何效果,也可能是本人水平不行,大神勿噴。

最後,我通過修改VerticalViewPager的事件攔截,實現了這個效果,下面就是我在castorflex/VerticalViewPager的程式碼基礎上,在onInterceptTouchEvent方法裡新增的程式碼,如果各位有更好的方法,請留言分享給我,向大家學習,謝謝!

    /**
     * 如果是上下滑動事件,攔截下來,自己處理
     * 解決巢狀RecyclerView問題
     */
    private float x = 0;//初始化按下時座標變數
    private float y = 0;//初始化按下時座標變數

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        /**
         * 如果是上下滑動事件,攔截下來,自己處理
         * 解決巢狀RecyclerView問題
         */
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //記錄按下時的座標
                x = ev.getX();
                y = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float dX = Math.abs(x - ev.getX());
                float dY = Math.abs(y - ev.getY());

                //根據螢幕大小,調整能引發VerticalViewpager攔截豎直滑動的最小高度
                int screenHeight = ScreenUtils.getScreenHeight(context);
                //因為我的HonyWell的PDA螢幕高是800,攔截豎直滑動的最小高度設定為200比較合適,所以以此適配
                int scrollHeight = screenHeight * 200 / 800;//引發VerticalViewpager攔截豎直滑動的最小高度
                //滿足豎直滑動,並且滑動高度大於“引發VerticalViewpager攔截豎直滑動的最小高度”時,攔截此滑動事件,不再交給下面的RecyclerView處理
                if (dY > scrollHeight && dY > dX) {
                    Log.e("MyVerticalViewPager", "MyVerticalViewPager");
                    return true;
                }
                break;
        }

   }