2015-08-27 15 views
19

Ho una vista di riciclatore ... e voglio uno scrolldown fluido e poi lo faccio scorrere in modo programmatico per mostrare all'utente il contenuto completo in esso .... e iM in grado di farlo daCome posso controllare la velocità di scorrimento di recyclerView.smoothScrollToPosition (posizione)

final int height=recyclerView.getChildAt(0).getHeight(); 
    recyclerView.smoothScrollToPosition(height); 
    recyclerView.postDelayed(new Runnable() { 
     public void run() { 
      recyclerView.smoothScrollToPosition(0); 
         } 
    },200); 

ma quello che voglio è ... di rallentare la velocità di scorrimento in modo che l'intero contenuto ottenere visibile clearlly.So, qualcuno può aiutarmi a cercata fuori. Thxs ...

+0

Ciao, sto cercando di fare lo stesso. Hai mai raggiunto una soluzione? Grazie. @Dipika –

+0

hey JayS ... No, non ho ancora trovato nessuna soluzione. – Dipika

risposta

44

solo per migliorare alla risposta un po ':

public class SpeedyLinearLayoutManager extends LinearLayoutManager { 

    private static final float MILLISECONDS_PER_INCH = 5f; //default is 25f (bigger = slower) 

    public SpeedyLinearLayoutManager(Context context) { 
     super(context); 
    } 

    public SpeedyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { 
     super(context, orientation, reverseLayout); 
    } 

    public SpeedyLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 

     final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { 

      @Override 
      public PointF computeScrollVectorForPosition(int targetPosition) { 
       return SpeedyLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition); 
      } 

      @Override 
      protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
       return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; 
      } 
     }; 

     linearSmoothScroller.setTargetPosition(position); 
     startSmoothScroll(linearSmoothScroller); 
    } 
} 
12

Ho trovato una risposta!

È necessario creare una classe personalizzata che si estende [LinearLayoutManager][1] e quindi sovrascrivere il metodo [smoothScrollToPosition][1]. All'interno, è necessario creare un nuovo [LinearSmoothScroller][1] e sovrascrivere il metodo calculateSpeedPerPixel Quindi utilizzare tale LinearSmoothScroller per completare lo scorrimento.

Ecco il mio esempio:

public class CustomLinearLayoutManager extends LinearLayoutManager{ 
     @Override 
     public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 
      final LinearSmoothScroller linearSmoothScroller = 
        new LinearSmoothScroller(recyclerView.getContext()) { 
         private static final float MILLISECONDS_PER_INCH = 100f; 

         @Override 
         public PointF computeScrollVectorForPosition(int targetPosition) { 
          return CustomLinearLayoutManager.this 
           .computeScrollVectorForPosition(targetPosition); 
        } 

        @Override 
        protected float calculateSpeedPerPixel 
          (DisplayMetrics displayMetrics) { 
         return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; 
        } 
       }; 
     linearSmoothScroller.setTargetPosition(position); 
     startSmoothScroll(linearSmoothScroller); 
    } 
} 

Assegnare questo CustomLinearLayoutManager al RecyclerView e si dovrebbe essere pronti per partire. Fammi sapere se non sono stato chiaro in nulla. Sarò felice di aiutare.

+0

hey @Jay S, puoi dirmi quale versione di min SDK stai usando. Poiché utilizzo solo 15 con appcompat-v7: la libreria di supporto 22.2.0 e la classe SnappyLinearLayoutManager non è lì da usare. – Dipika

+0

Grazie. Questo ha funzionato per me. – viper

2

Ho fatto una versione che è possibile impostare la variabile velocità di scorrimento.

Se si imposta factor su 2, sarà due volte più lento di default.

public class VariableScrollSpeedLinearLayoutManager extends LinearLayoutManager { 

    private final float factor; 

    public VariableScrollSpeedLinearLayoutManager(Context context, float factor) { 
     super(context); 
     this.factor = factor; 
    } 

    @Override 
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { 

     final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { 

      @Override 
      public PointF computeScrollVectorForPosition(int targetPosition) { 
       return VariableScrollSpeedLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition); 
      } 

      @Override 
      protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
       return super.calculateSpeedPerPixel(displayMetrics) * factor; 
      } 
     }; 

     linearSmoothScroller.setTargetPosition(position); 
     startSmoothScroll(linearSmoothScroller); 
    } 
} 
0

ho trovato una soluzione difficile per questa domanda possiamo usare CountDownTimer, sta funzionando ...

new CountDownTimer(1000, 1000) { 
     public void onTick(long millisUntilFinished) { 
     } 
     public void onFinish() { 

      recyclerViewSelectionTest.scrollToPosition(position + 1); 
     } 
    }.start(); 

questo codice ha fatto ritardo di un secondo al riciclatore

1

Per quelli disinteressati ignorando LinearLayoutManager (o qualsiasi sottoclasse che si sta utilizzando), è possibile chiamare semplicemente startSmoothScroll(smoothScroller) direttamente sul gestore di layout.

LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { 

    @Override 
    protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { 
     return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; 
    } 
}; 

linearSmoothScroller.setTargetPosition(position); 
layoutManager.startSmoothScroll(linearSmoothScroller); 
+0

Come posso impostare qui, per regolare lo scorrimento in una posizione in un secondo, ad esempio? –

+0

Non c'è una soluzione semplice per questo. Il problema è che la vista del riciclatore non sa quanto sia distante una posizione, quindi LinearSmoothScroll fondamentalmente scorre semplicemente nella direzione generale di dove si trova la vista, e quindi rallenta quando la vista viene visualizzata sullo schermo. Dovresti scrivere un sacco di strutture extra per farlo da solo. –

+0

Cosa succede se tutte le celle hanno la stessa dimensione (o se ho una dimensione media, o una stima di tutte) e, naturalmente, conosco il numero di celle in arrivo? –

Problemi correlati