全網唯一有用的解決方案!徹底解決VerticalViewPager巢狀RecyclerView引起的滑動衝突!
阿新 • • 發佈:2019-01-09
首先承認標題的確很裝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; } }