9

Desidero implementare un recyclerview all'interno di un viewpager verticale. Il mio layout attuale è simile al seguenteAndroid: RecyclerView all'interno di viewpager verticale

VerticalViewpager 
- Fragment1 
    - ImageView 
- Fragment2 
    - RecyclerView 

Se scorri da un Fragment1 a Fragment2 tutto funziona bene. Sono in grado di scorrere all'interno del recyclerview su e giù. Il problema si verifica se provo a scorrere/scorrere di nuovo a Fragment1.

Se l'utente ha spostato verso l'alto del recyclerview, desidero inoltrare il successivo evento "Su" -Scroll al viewpager verticale. Ho provato a sovrascrivere il metodo onInterceptTouchEvent, ma sfortunatamente ancora non ha avuto successo. Qualche idea là fuori? Grazie per il tuo aiuto :)

+0

Hi! Devo fare esattamente la stessa cosa, fortuna? – Caique

+0

Ciao @Caique, purtroppo nessuna soluzione che funziona in tutti i nostri casi. Il suggerimento di Mr. India ci è stato d'aiuto, ma come ho già accennato nel mio commento sotto il suo suggerimento questa soluzione non funziona ogni volta. – jennymo

+0

Thks per la risposta. Quello che ho fatto è stato: ho sovrascritto l'onTouch del recyclerview, ho ottenuto la velocità da ACTION_DOWN, ACTION_MOVE e ACTION_UP, e se la velocità è> 500 (sta salendo con una certa velocità) torno indietro di una posizione su viewpager. Funziona piuttosto bene. Pubblicherò una risposta con il codice, forse potrebbe aiutarti – Caique

risposta

2

È necessario disattivare lo scroll. Prova a utilizzare recyclerView.setNestedScrollingEnabled(false);

+1

Ciao, grazie per la tua risposta.L'ho provato e funziona ... a volte: D Se ho raggiunto la cima del recyclerview devo scorrere almeno quattro o cinque volte, fino a quando VerticalViewpager ottiene l'evento e scorre su Fragment1. Qualche idea su cosa causa questo comportamento? – jennymo

2

1) È necessario utilizzare la libreria di supporto 23.2.0 (o) sopra 2) e l'altezza di recyclerView sarà wrap_content. 3) recyclerView.setNestedScrollingEnabled (false)

Ma in questo modo lo schema di riciclaggio non funziona. (tutte le viste verranno caricate in una sola volta poiché wrap_content richiede l'altezza di recyclerView completa in modo da disegnare tutte le viste del riciclatore contemporaneamente. Nessuna vista verrà riciclata). Cerca di non utilizzare questo util util, a meno che non sia strettamente necessario.

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); 
      } 
      }); 

Utilizzando questo codice è possibile determinare se l'utente si trova nella posizione più alta. Nella posizione è possibile impostare la visualizzazione del cercapersone per spostarsi nella posizione desiderata.

+0

Il rilevamento non funziona se l'utente si trova già nella posizione più alta nella visualizzazione recycler e prova a scorrere verso l'alto ancora più in alto per attivare il viewpager. –

+0

@AlexanderHoffmann :: prova a dichiarare ** int topRowVerticalPosition = 0; ** come pubblico. – Jeevanandhan

+0

Non riesco a impostare la variabile su public all'interno del metodo onScroll. Avrebbe comunque senso qui, no? –

1

Se si ha accesso VerticalViewPager da RecyclerView, è possibile estendere RecyclerView e verificare canScrollVertically(-1) e in avanti evento di tocco di viewpager

0

Ho avuto lo stesso problema. La risposta di Mr. India è stata utile, ma come hai commentato, ha funzionato solo a volte.

Quello che ho fatto è stato

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; 
      } 
     }); 

Sulla ACTION_UP verifico se la velocità> 500, vuol dire che sta salendo su una velocità considerata e la topRowVerticalPosition significa che è in cima alla recyclerview. Quindi ottengo ViewPager e setCurrentItem sull'elemento precedente.

E 'un po' di hack sporco, ma era l'unico modo che ho trovato per fare apparire come un buon scorrimento tra le pagine sulla verticale 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); 
       } 
      } 
     }); 
Problemi correlati