自定義RefreshLayoutView與嵌套的RecyclerView的滑動衝突

1.問題描述:
首先看一下:
這裏寫圖片描述
2代表的是RecyclerView,1代表的是其他的佈局。
問題場景是這樣的:

外層是一個自定義的可下拉刷新的控件,它的內部嵌套一個RecyclerView(Recycleview上方還有一個佈局)
出現的問題是:當RecyclerView可以上下滑動,當下拉到頂部的時候(把這裏記爲特殊狀態),再下拉不觸發RefreshLayoutView(外層)的刷新監聽,如果在RecyclerView上方的那個佈局下拉是能觸發刷新的。
(需求是:RecyclerView可以上拉,當RecyclerView下拉滑動到頂部的時候,再下拉應該觸發RefreshLayoutView刷新)

2.分析:
因爲所有的事件分發都是在外層這個自定義控件中,發生在RecyclerView範圍內下拉不觸發刷新的原因,是由於在特殊狀態下,外層沒有將事件攔截,而是將事件分發給了下面的RecyclerView,RecyclerView默認將事件消費掉了。

3.解決問題:
爲了解決這個問題,我在網上看了很多事件分發的原理,其中這篇文章我覺得寫的不錯,對我幫助挺大的:
https://www.jianshu.com/p/e99b5e8bd67b

接下來看一下問題的解決:
在外層的RefreshLayoutView的onInterceptTouchEvent方法中,在特殊狀態情況下,選擇將不講事件分發,而是自己消費掉。

        getChildView();

        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                downYY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float curY = ev.getY();
                float deltaY = curY - downYY;
                //返回false表示已經到頂部了,並且是下拉的狀態下,此時應該攔截,
                if(!mChildView.canScrollVertically(-1)){//到頂部
                    if(deltaY >= 40){//下拉
                        canScrollVertically = false;
                    }else {
                        canScrollVertically = true;
                    }
                }else {
                    canScrollVertically = true;
                }
                break;
            case MotionEvent.ACTION_UP:

                downY = Float.MAX_VALUE;
                break;
        }

        if (!interceptAllMoveEvents) {//表示不向下攔截
            return !disallowIntercept || !canScrollVertically;
        }
        // 如果設置了攔截所有move事件,即interceptAllMoveEvents爲true
        if (MotionEvent.ACTION_MOVE == ev.getAction()) {
            return true;
        }
        return false;

核心是這個switch代碼塊

//當返回false的時候表示已經在頂部
mChildView.canScrollVertically(-1)

同時還要是有效的下拉操作的時候,將這個特殊狀態的標誌canScrollVertically 設爲false,其他情況向下設爲true。

當然了,這個可能只是適用於我遇到的這種情況,大家遇到問題的時候需要具體問題具體分析。

發佈了69 篇原創文章 · 獲贊 24 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章