9

verticalviewpager内でrecyclerviewを実装したいと思います。私の現在のレイアウトは、次のようになりますAndroid:RecyclerView in vertical viewpager

VerticalViewpager 
- Fragment1 
    - ImageView 
- Fragment2 
    - RecyclerView 

私がFragment1からFragment2にスワイプすると、すべて正常に動作します。私は、recyclerview内を上下にスクロールすることができます。この問題は、スワイプ/スクロールしてFragment1に戻そうとすると発生します。

ユーザーがrecyclerviewの上部にスクロールした場合、次の「Up」-Scrollイベントを垂直ビューページに転送したいと思います。私はonInterceptTouchEventメソッドをオーバーライドしようとしましたが、残念ながらまだ成功していません。そこに任意のアイデア?あなたの助けをありがとう:)

+0

こんにちは上のページの間に良好なスクロールのような外観を作るために見つけた唯一の方法でした!私はまったく同じことを行う必要があります、運は何ですか? – Caique

+0

こんにちは@Caique、残念ながら私たちのすべてのケースで動作するソリューションはありません。 Mr. Indiaからの提案は私たちにとって有益でしたが、彼の提案の下でコメントしたところでは、この解決策は毎回機能しません。 – jennymo

+0

答えが分かりました。私がしたことは:recyclerviewのonTouchを圧倒し、ACTION_DOWN、ACTION_MOVE、ACTION_UPから速度を得ました。速度が> 500(ある速度で上がっている)ならば、私はviewpagerの1つの位置に戻ります。それはかなりうまくいっています。私はコードで答えとして投稿し、多分あなたを助けることができる – Caique

答えて

2

あなたはscrollを無効にする必要があります。試してみてくださいrecyclerView.setNestedScrollingEnabled(false);

+1

こんにちは、あなたの答えのためのthans。私はそれを試してみました...時々:Dもし私がrecyclerviewの上に到達したら、VerticalViewpagerがイベントを取得してFragment1にスクロールするまで少なくとも4〜5回スクロールする必要があります。何が原因で何が起こるのでしょうか? – jennymo

2

1)support library 23.2.0(または)above 2)を使用する必要があり、recyclerViewの高さはwrap_contentになります。 3)recyclerView.setNestedScrollingEnabled(false)

しかし、これを行うことで、リサイクルパターンは機能しません。 (つまり、wrap_contentが完全なrecyclerViewの高さを必要とするため、すべてのビューが一度に読み込まれますので、すべてのリサイクルビューを一度に描画するので、ビューはリサイクルされません)。本当に必要でない限り、このパターンutilを使用しないでください。

1
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
       @Override 
       public void onScrolled (RecyclerView recyclerView,int dx, int dy) { 
       int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); 
       if (topRowVerticalPosition >= 0) { 
        //top position 
       } 
      } 
       @Override 
       public void onScrollStateChanged (RecyclerView recyclerView,int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 
      }); 

このコードを使用すると、ユーザーがトップにいるかどうかを確認できます。この位置では、ビューページャを目的の位置に移動させることができます。あなたはRecyclerViewからのアクセスVerticalViewPagerを持っている場合は

+0

ユーザーがリサイクラビューの一番上の位置にあり、ビューページをトリガするためにさらに上にスクロールしようとすると、検出は機能しません。 –

+0

@AlexanderHoffmann :: ** int topRowVerticalPosition = 0; **をpublicとして宣言してください。 – Jeevanandhan

+0

onScrollメソッド内で変数をpublicに設定できません。とにかくここで意味をなさないでしょうね。 –

1

することは、あなたが親scrollview にnestedscroll禁止する必要が

1

をviewpagerするRecyclerViewを拡張し、canScrollVertically(-1)をチェックして、タッチイベントを転送することができます私はこのための新しい実装している、あなたは以下試すことができますリンクhttps://github.com/liuxiaocong/VerticalViewpage

0

私は同じ問題がありました。 Mr.Indiaからの回答は役に立ちましたが、あなたのコメントとして、時にはうまくいきました。私が何をしたか

は> 500の速度は、それはそれは考えられ速度にまで起こっているのとtopRowVerticalPositionが、それはrecyclerviewの上にあることを意味を意味している場合、私は確認しACTION_UPオン

recyclerView.setOnTouchListener(new View.OnTouchListener() { 
      public float speed; 
      public VelocityTracker mVelocityTracker; 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int index = event.getActionIndex(); 
       int action = event.getActionMasked(); 
       int pointerId = event.getPointerId(index); 

       switch (action) { 

        case MotionEvent.ACTION_DOWN: 
         if(mVelocityTracker == null) { 
          mVelocityTracker = VelocityTracker.obtain(); 
         } 
         else { 
          mVelocityTracker.clear(); 
         } 
         mVelocityTracker.addMovement(event); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         if(mVelocityTracker != null) { 
          mVelocityTracker.addMovement(event); 
          mVelocityTracker.computeCurrentVelocity(1000); 
          speed = VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId); 
         } 
         break; 
        case MotionEvent.ACTION_UP: 
         int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); 
         if(speed > 500 && topRowVerticalPosition >= 0) { 
          ReaderFragmentParent parent = (ReaderFragmentParent) getActivity(); 
          ReaderPager pager = parent.getPager(); 
          if(pager != null) { 
           pager.setCurrentItem(pager.getCurrentItem()-1); 
          } 

         } 
         return false; 
        case MotionEvent.ACTION_CANCEL: 
         mVelocityTracker.recycle(); 
         break; 
       } 


       return false; 
      } 
     }); 

ました。次にViewPagerとsetCurrentItemを前の項目に取得します。

それは汚いハックのビットだが、それは私が垂直ViewPager

0
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled (RecyclerView recyclerView,int dx, int dy) { 

      } 
      @Override 
      public void onScrollStateChanged (RecyclerView recyclerView,int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 

       if (!mRecyclerView.canScrollVertically(-1) && newState == 0) { 

        Log.e("canScrollVertically", mRecyclerView.canScrollVertically(-1)+""); 

        verticalViewPager.setCurrentItem(0, true); 
       } 
      } 
     });