1. 程式人生 > >scrollView 巢狀recyclerView 滑動粘合解決

scrollView 巢狀recyclerView 滑動粘合解決

我用半個小時做總結   

昨天下午5店發現這個問題,就在剛剛才解決。 解決辦法很簡單,而且從昨天到現在 在我眼前飄了不少於10次才被我識別出它的強大

需求描述:

首頁是一個很長的內容豐滿的頁面, 裡面有兩個卡片,此二卡片有個列表可展開,列表展開後卡片鋪滿一頁,重點是,當卡片展開後,此首頁就只有一個卡片無其他了,更別提滾動了。但是不能簡簡單單將其他內容VIew.Gone掉,因為,展開是動畫,是緩慢的動作,是上下慢慢展開,是其他擠出頁面的視覺效果,而且卡片收縮的時候,也是慢慢收縮,其他內容慢慢回到頁面的過程。

問題:

那麼,卡片展開的同時,首頁的scrollView不能滾動。

問題解決:

1.第一階段自然想到的是事件攔截,scrollView事件直接不處理就好了,這很簡單

onInterceptTouchEvent 返回 false
onTouchEvent 返回 false.第一階段自然想到的是事件攔截,scrollView事件直接不處理就好了,這很簡單

此時scrollView的滾動是不進行了,被展開的卡片除了RecyclerView 可滾動外,其餘就根本不會觸發滾動,就真的像是一頁只有一個卡片一樣,可是RecyclerView滑到邊界時候,如果用盡滑動RecyclerView,會帶動scrollView滾動。。。。。scrollView滾動不是遮蔽了嗎,scrollView 的scrollChange也沒有觸發呀~~~  

打斷點檢視RecyclerView的滑動呼叫 呼叫之前會先呼叫父類,檢視父類是否滑動 即dispatchNestedPreScroll()返回false,滑動之後呼叫父類檢視是否呼叫,即:dispatchNestedScroll()也是返回false,這奇怪的問題

2 其實到這部可以確定和NestedScroll滾動有關,

//返回true代表父view消耗滑動速度,子View將不會滑動
@Override
public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
    if (null == mRecyclerView) mRecyclerView = (RecyclerView) target;
    return false;
}

//對應子view 的dispatchNestedPreScroll方法, 最後一個數組代表消耗的滾動量,下標0代表x軸,下標1代表y軸
@Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { //判斷是否滾動到最大值 if (null == mRecyclerView) mRecyclerView = (RecyclerView) target; //計算RecyclerView的偏移量, 等於0的時候說明recyclerView沒有滑動,否則應該交給recyclerView自己處理 if (mRecyclerView.computeVerticalScrollOffset() != 0) return; this.smoothScrollBy(dx, dy); consumed[1] = dy; //consumed[1]賦值為 dy ,代表父類已經消耗了改滾動。 }

這兩個方法看著和父類子類滾動有關,重寫之後依然沒有任何效果

3 。繼續檢視發現一片文章 

觸控到RecyclerView的時候滑動還有些粘連的感覺,只需要在程式碼中設定

mRecyclerView.setNestedScrollingEnabled(false);
對呀,在滑動recyclerView時候,外部滑動,是黏連效應呀,可以試試 果然OK了。。

那麼這個方法是什麼意思呢 ,檢視此引數呼叫的地方,發現很多地方都是吧isNestedScrollingenable 引數和mNestedScrollingParent同時使用判斷,因為父類我們之前已經遮蔽掉了,所以只需檢視單純判斷isNestedScrollingenable的地方 只有一個 與startNestedScroll 有關:

startNestedScroll  方法如果返回ture則說明有一個與巢狀滑動合作的父類,但是我們想要的是false,即不讓巢狀RecyclerView的滾動影響到ScrollView .所以設定為false就OK了

重要知識點:

 Child 滑動開始的呼叫 startNestedScroll(),Parent 收到 onStartNestedScroll() 回撥,決定是否需要配合 Child 一起進行處理滑動,如果需要配合,還會回撥onNestedScrollAccepted()。

參考文章:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0822/3342.html

http://www.jianshu.com/p/791c0a4acc1c