(Smooth)Scrolltopposition ne fonctionne pas correctement avec RecyclerView

J'utilise RecyclerView basic avec GridLayoutManager. J'ai observé que la position nor smoothscrolltopposition nor scrolltopposition fonctionne correctement.

a) en utilisant smoothScrollToPosition je reçois souvent des erreur de RecyclerView

"RecyclerView Money Passed over target position while smooth scrolling."

et RecyclerView n'est pas bien déroulé (souvent il manque la rangée ciblée). Ceci est observé surtout quand j'essaie de faire défiler vers le 1er article de certains rang

b) en utilisant scrollToPosition il semble fonctionner assez bien, mais, la plupart du temps, je peux voir seulement le 1er élément de la ligne et le reste ne sont pas affichés.

pouvez-vous me donner quelques conseils sur la façon de faire fonctionner correctement au moins une des méthodes?

Merci beaucoup!

32
demandé sur MiguelHincapieC 2015-06-15 15:55:43

6 réponses

finalement j'ai réussi à faire en sorte que ça marche! LinearLayoutManager.scrollToPositionWithOffset(int, int) a fait l'affaire.

48
répondu petrushka1986 2016-03-28 20:46:48

j'ai aussi le MÊME PROBLÈME, MAIS j'ai réussi à corriger le problème en personnalisant SmoothScroller

laissez Personnalisé LayoutManager comme ci-dessous

public class CustomLayoutManager extends LinearLayoutManager {
    private static final float MILLISECONDS_PER_INCH = 50f;
    private Context mContext;

    public CustomLayoutManager(Context context) {
        super(context);
        mContext = context;
    }

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

        LinearSmoothScroller smoothScroller = 
            new LinearSmoothScroller(mContext) {

            //This controls the direction in which smoothScroll looks
            //for your view
            @Override
            public PointF computeScrollVectorForPosition
            (int targetPosition) {
                return CustomLayoutManager.this
                    .computeScrollVectorForPosition(targetPosition);
            }

            //This returns the milliseconds it takes to 
            //scroll one pixel.
            @Override
            protected float calculateSpeedPerPixel
                (DisplayMetrics displayMetrics) {
                return MILLISECONDS_PER_INCH/displayMetrics.densityDpi;
            }
        };

        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }
}

(documentation commentée à l'intérieur du code donné ci-dessus)veuillez définir le LayoutManager ci-dessus à la recyerview

CustomLayoutManagerlayoutManager = new CustomLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
recyclerView.smoothScrollToPosition(position);

en utilisant le gestionnaire de Mise en page personnalisée

scrolltopposition aussi bien dans mon cas, u peut utiliser

recyclerView.scrollToPosition(position)

aussi, si vous souhaitez ajuster la vitesse de la position du rouleau lissant veuillez remplacer le

private static final float MILLISECONDS_PER_INCH = 50f;

in CustomLayoutManager. Donc si nous mettons la valeur comme 1f la position lisse de scrollTop sera plus rapide comme la position de scrollTop.augmenter la valeur faire retard et diminuer fera la vitesse de défilement. Espérons que cela sera utile.

13
répondu Ramz 2016-12-19 18:40:49

Dans Mon cas,

`mRecyclerView.scrollToPosition(10);` 

aussi, n'a pas de travail. Mais

`mRecyclerView.smoothScrollToPosition(10);` 

fonctionne très bien pour moi...

7
répondu zephyr 2017-06-13 12:09:47

pour faire défiler vers le bas à partir de n'importe quelle position dans la RecyclerView en cliquant sur EditText.

edittext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                rv_commentList.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                      rv_commentList.scrollToPosition(rv_commentList.getAdapter().getItemCount() - 1);
                    }
                }, 1000);
            }
        });
5
répondu Muhammad Umair Shafique 2016-02-11 15:52:28

essayez de mesurer la largeur ou la hauteur de l'article et appelez smoothScrollBy(int DX, int dy).

1
répondu Dubrovin 2017-03-21 14:26:44

appeler le smoothScroll de recyclerView n'est pas efficace, car le recyclerView lui-même ne gère pas sa mise en page.

ce que vous devez faire est d'appeler la méthode scroll du gestionnaire de mise en page à la place.

Cela devrait ressembler à quelque chose comme ceci

mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition);
0
répondu orelzion 2015-06-15 13:02:09