2015-10-31 21 views
19

Devo rilevare l'inizio/la fine e la direzione di scorrimento in una panoramica di riciclaggio. Il listener di scorrimento ha due metodi: onScrolled() e onScrollStateChanged(). Il primo metodo viene chiamato dopo l'avvio dello scorrimento (infatti viene chiamato onScrolled() e non onScrolling()). Il secondo metodo fornisce informazioni sullo stato ma non ho le informazioni sulla direzione. Come posso raggiungere il mio obiettivo?Rileva lo scorrimento iniziale e termina lo scorrimento in recyclerview

risposta

34

fase 1 è possibile creare una classe che estende RecyclerView.OnScrollListener e sovrascrivere questi metodi

public class CustomScrollListener extends RecyclerView.OnScrollListener { 
    public CustomScrollListener() { 
    } 

    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     switch (newState) { 
      case RecyclerView.SCROLL_STATE_IDLE: 
       System.out.println("The RecyclerView is not scrolling"); 
       break; 
      case RecyclerView.SCROLL_STATE_DRAGGING: 
       System.out.println("Scrolling now"); 
       break; 
      case RecyclerView.SCROLL_STATE_SETTLING: 
       System.out.println("Scroll Settling"); 
       break; 

     } 

    } 

    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     if (dx > 0) { 
      System.out.println("Scrolled Right"); 
     } else if (dx < 0) { 
      System.out.println("Scrolled Left"); 
     } else { 
      System.out.println("No Horizontal Scrolled"); 
     } 

     if (dy > 0) { 
      System.out.println("Scrolled Downwards"); 
     } else if (dy < 0) { 
      System.out.println("Scrolled Upwards"); 
     } else { 
      System.out.println("No Vertical Scrolled"); 
     } 
    } 
} 

passo 2- Dal setOnScrollListener è deprecato E 'meglio usare addOnScrollListener

mRecyclerView.addOnScrollListener(new CustomScrollListener()); 
+0

Plus One ........ Funziona come un fascino. Grazie –

+1

'RecyclerView.OnScrollListener' non è un'interfaccia/facepalm @ google dev che l'ha deciso. –

26

Vedere la documentazione per onScrollStateChanged(int state). I tre valori possibili sono:

  • SCROLL_STATE_IDLE: è fatto No scorrimento.
  • SCROLL_STATE_DRAGGING: l'utente sta trascinando il dito sullo schermo (o è stato fatto programatically
  • SCROLL_STATE_SETTLING:. L'utente ha alzato il dito, e l'animazione è ora rallentando

Quindi, se si. vuole rilevare quando lo scorrimento è inizio e fine, quindi è possibile creare qualcosa di simile:

public void onScrollStateChanged(int state) { 
    boolean hasStarted = state == SCROLL_STATE_DRAGGING; 
    boolean hasEnded = state == SCROLL_STATE_IDLE; 
} 
+1

OK ma come può rilevare anche la direzione ad lo stesso tempo? – greywolf82

+3

È possibile eseguire l'override di 'onScrolled (int dx, int dy)' e controllare se 'dy' è positivo o negativo, che fornisce l'una o l'altra direzione. –

2

modo più semplice per farlo è quello di tirare fuori il tuo LayoutManager. Per esempio

private RecyclerView.OnScrollListener mListener = new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 

     GridLayoutManager layoutManager=GridLayoutManager.class.cast(recyclerView.getLayoutManager()); 
     int visibleItemCount = layoutManager.getChildCount(); 
     int totalItemCount = layoutManager.getItemCount(); 
     int pastVisibleItems = layoutManager.findFirstCompletelyVisibleItemPosition(); 

     if(pastVisibleItems+visibleItemCount >= totalItemCount){ 
      // End of the list is here. 
      Log.i(TAG, "End of list"); 
     } 
    } 
} 

Spero che aiuti!

0

qui è la soluzione completa per fare un'azione dopo scorrimento viene arrestato (per RecyclerView)

che ha corretto i miei OutOfBounds eccezione legati alla recyclerView scorrimento

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
        @Override 
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
         //Your action here 
        } 
       }); 
Problemi correlati