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...

30
demandé sur Dipika 2015-08-27 09:15:57

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);
65
répondu Joe Maher 2018-03-22 10:59:22

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.

13
répondu Jay S. 2016-05-25 11:47:01

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);
    }
}
6
répondu Boy 2016-09-30 08:12:13

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);
3
répondu David Liu 2017-09-26 23:39:05

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

-1
répondu Hosein Mohsenian 2017-08-29 11:48:35