1. 程式人生 > >解決垂直RecyclerView巢狀水平RecyclerView橫向滑問題

解決垂直RecyclerView巢狀水平RecyclerView橫向滑問題

如下程式碼主要解決兩個問題:

解決ViewPager巢狀垂直RecyclerView巢狀水平RecyclerView橫向滑動到底後不滑動ViewPager

解決思路: 繼承RecyclerView,重寫dispatchTouchEvent,根據ACTION_MOVE的方向判斷是否呼叫getParent().requestDisallowInterceptTouchEvent去阻止父view攔截點選事件

      @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
     
        /*---解決垂ViewPager巢狀直RecyclerView巢狀水平RecyclerView橫向滑動到底後不滑動ViewPager start ---*/
        ViewParent parent =this;
        while(!((parent = parent.getParent()) instanceof ViewPager));// 迴圈查詢viewPager
        parent.requestDisallowInterceptTouchEvent(true);
        /*---解決垂ViewPager巢狀直RecyclerView巢狀水平RecyclerView橫向滑動到底後不滑動ViewPager start ---*/
        return super.dispatchTouchEvent(ev);
    }

解決垂直RecyclerView巢狀水平RecyclerView橫向滑動不流暢問題

解決思路:迴圈查詢父親View是否為ViewPager,如果是,則阻止父view攔截事件

      @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        
        /*--------解決垂直RecyclerView巢狀水平RecyclerView橫向滑動不流暢問題 start --------*/
        int x = (int) ev.getRawX();
        int y = (int) ev.getRawY();
        int dealtX = 0;
        int dealtY = 0;

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                dealtX = 0;
                dealtY = 0;
                // 保證子View能夠接收到Action_move事件
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                dealtX += Math.abs(x - lastX);
                dealtY += Math.abs(y - lastY);
                // Log.i("dispatchTouchEvent", "dealtX:=" + dealtX);
                // Log.i("dispatchTouchEvent", "dealtY:=" + dealtY);
                // 這裡是夠攔截的判斷依據是左右滑動,讀者可根據自己的邏輯進行是否攔截
                if (dealtX >= dealtY) {
                    getParent().requestDisallowInterceptTouchEvent(true);
                } else {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_UP:
                break;

        }
        /*--------解決垂直RecyclerView巢狀水平RecyclerView橫向滑動不流暢問題 end --------*/

        return super.dispatchTouchEvent(ev);
    }

完整程式碼

package com.leo.demo.view;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewParent;

/**
 * Created by kangyi on 2018/6/15.
 */

public class HorizontalRecyclerView extends RecyclerView {
    int lastX = 0;
    int lastY = 0;
    public HorizontalRecyclerView(Context context) {
        super(context);
    }

    public HorizontalRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public HorizontalRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        
        /*--------解決垂直RecyclerView巢狀水平RecyclerView橫向滑動不流暢問題 start --------*/
        int x = (int) ev.getRawX();
        int y = (int) ev.getRawY();
        int dealtX = 0;
        int dealtY = 0;

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                dealtX = 0;
                dealtY = 0;
                // 保證子View能夠接收到Action_move事件
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                dealtX += Math.abs(x - lastX);
                dealtY += Math.abs(y - lastY);
                // Log.i("dispatchTouchEvent", "dealtX:=" + dealtX);
                // Log.i("dispatchTouchEvent", "dealtY:=" + dealtY);
                // 這裡是夠攔截的判斷依據是左右滑動,讀者可根據自己的邏輯進行是否攔截
                if (dealtX >= dealtY) {
                    getParent().requestDisallowInterceptTouchEvent(true);
                } else {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_UP:
                break;

        }
        /*--------解決垂直RecyclerView巢狀水平RecyclerView橫向滑動不流暢問題 end --------*/


        /*---解決ViewPager巢狀垂直RecyclerView巢狀水平RecyclerView橫向滑動到底後不滑動ViewPager start ---*/
        ViewParent parent =this;
        while(!((parent = parent.getParent()) instanceof ViewPager));// 迴圈查詢viewPager
        parent.requestDisallowInterceptTouchEvent(true);
        /*---解決ViewPager巢狀垂直RecyclerView巢狀水平RecyclerView橫向滑動到底後不滑動ViewPager start ---*/
        return super.dispatchTouchEvent(ev);
    }
}

小禮物走一走,來簡書關注我

作者:康熙微博私訪記 連結:https://www.jianshu.com/p/4c87e0b6d16c 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。