Comment puis-je contrôler la vitesse de défilement de recyclerView.smoothScrollToPosition(position)
j'ai une vue de recycleur... et je veux un scrolldown lisse et puis scrollup à elle programatically pour montrer le contenu complet en elle à l'utilisateur .... Et je m en mesure de le faire par
final int height=recyclerView.getChildAt(0).getHeight();
recyclerView.smoothScrollToPosition(height);
recyclerView.postDelayed(new Runnable() {
public void run() {
recyclerView.smoothScrollToPosition(0);
}
},200);
mais est ce que je veux ... ralentir la vitesse de défilement afin que le contenu complet soit visible clairement.Quelqu'un peut-il m'aider à le chercher? Thxs...
5 réponses
Juste pour améliorer la réponse un peu:
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 super.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
}
et ensuite définir SpeedyLayoutManager à votre RecyclerView:
recyclerView.setLayoutManager(new SpeedyLinearLayoutManager(context, SpeedyLinearLayoutManager.VERTICAL, false);
j'ai trouvé la réponse!
vous devez faire une classe personnalisée étendre [LinearLayoutManager][1]
puis remplacer le [smoothScrollToPosition][1]
méthode. À l'intérieur, vous devez créer un nouveau [LinearSmoothScroller][1]
et de remplacer son calculateSpeedPerPixel méthode, Puis l'utiliser LinearSmoothScroller
pour compléter le rouleau.
Voici mon exemple :
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);
}
}
Attribuer cette CustomLinearLayoutManager
pour votre RecyclerView
et vous devriez être bon d'aller. Permettez-moi de savoir si j'ai été clair à quoi que ce soit. Je serai heureux de vous aider.
j'ai fait une version que vous pouvez définir la vitesse de défilement variable.
Si vous définissez factor
à 2, il sera deux fois plus lent que par défaut.
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);
}
}
pour ceux qui ne s'intéressent pas à la gestion des lignes (ou de la sous-classe que vous utilisez), vous pouvez simplement appeler startSmoothScroll(smoothScroller)
directement sur le gestionnaire de présentation.
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
layoutManager.startSmoothScroll(linearSmoothScroller);
j'ai trouvé une solution délicate pour cette question on peut utiliser CountDownTimer, ça marche...
new CountDownTimer(1000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
recyclerViewSelectionTest.scrollToPosition(position + 1);
}
}.start();
ce code a retardé d'une seconde votre recycleur