1. 程式人生 > >RecyclerView巢狀ViewPager事件處理問題

RecyclerView巢狀ViewPager事件處理問題

近期一直在處理一個問題,RecyclerView巢狀ViewPager的情況下,先滑動RecyclerView使ViewPager隱藏,再滑動出ViewPager後立即橫向滑動ViewPager,ViewPager得滑動兩次才響應,很明顯第一次滑動ViewPager的事件被外部的RecyclerView給消費掉了。列印日誌跟蹤第一次橫向滑動ViewPager的事件Action_Down的時候直接被RecyclerView給攔截了(onInterceptTounchEvent返回true),然後直接打斷點除錯RecyclerView的onInterceptTounchEvent,找出為什麼這種情況下Action_Down返回true.在Action_Down的處理邏輯中發現RecyclerView當前的狀態居然是SCROLL_STATE_SETTING並不是靜止,難道是RecyclerView自身的Bug?自己改了許久未果,後來直接給RecyclerView設定滑動監聽,才發現

08-11 22:09:29.404 12687-12687/com.android.e E/TAG: RecyclerViewCompat onInterceptTouchEvent down = true
08-11 22:09:29.405 12687-12687/com.android.e E/TAG: RecyclerViewCompat onTouchEvent down = true
08-11 22:09:29.410 12687-12687/com.android.e E/TAG: RecyclerViewCompat onTouchEvent move = true
08-11 22:09:29.427 12687-12687/com.android.e E/TAG: RecyclerViewCompat onTouchEvent move = true
08-11 22:09:29.444 12687-12687/com.android.e E/TAG: RecyclerViewCompat onTouchEvent move = true
08-11 22:09:29.471 12687-12687/com.android.e E/TAG: RecyclerViewCompat onTouchEvent move = true
08-11 22:09:29.472 12687-12687/com.android.e E/TAG: SCROLL_STATE_SETTLING
08-11 22:09:29.473

12687-12687/com.android.e E/TAG: RecyclerViewCompat onTouchEvent up = true
08-11 22:09:32.694 12687-12687/com.android.e E/TAG: SCROLL_STATE_IDLE

可以發現當事件已經結束一小段時間RecyclerView才置自己的狀態為靜止。也即是我們再一次滑動出ViewPager的時候,過一小段時間才能滑動ViewPager,因為這時候RecyclerView狀態才是靜止的。自己改了很久,後來才知道,欲哭無淚!!!後來google了一下,發現一個可行的解決辦法:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_SETTLING){
            mRecyclerView.stopScroll();
        }
    }

但是有時候RecyclerView滑動有點小問題