web-dev-qa-db-fra.com

(Smooth) ScrollToPosition ne fonctionne pas correctement avec RecyclerView

J'utilise de base RecyclerView avec GridLayoutManager. J'ai observé que ni smoothScrollToPosition ni scrollToPosition ne fonctionne correctement.

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

"RecyclerView ﹕ est passé sur la position cible lors du défilement régulier."

et RecyclerView ne défile pas correctement (il manque souvent la ligne ciblée). Ceci est observé principalement lorsque j'essaie de faire défiler jusqu'au premier élément d'une ligne

b) lorsqu’on utilise scrollToPosition, il semble fonctionner assez bien, mais la plupart du temps, je ne vois que le premier élément de la ligne et les autres éléments ne sont pas affichés.

Pouvez-vous me donner quelques astuces pour faire fonctionner correctement au moins une des méthodes?

Merci beaucoup!

36
petrushka1986

Finalement, j'ai réussi à le faire fonctionner! LinearLayoutManager.scrollToPositionWithOffset(int, int) a fait le tour.

53
petrushka1986

J'ai également le même problème, mais j'ai réussi à résoudre le problème en personnalisant SmoothScroller.

laisser Custom 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 dans le code donné ci-dessus) Définissez le gestionnaire LayoutManager ci-dessus sur la vue d'ensemble.

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

en utilisant le gestionnaire de disposition personnalisé 

scrollToPosition travaille aussi bien dans mon cas, vous pouvez utiliser

recyclerView.scrollToPosition(position)

aussi si vous voulez ajuster la vitesse de smoothScrollToPosition s'il vous plaît remplacer la

private static final float MILLISECONDS_PER_INCH = 50f;

dans CustomLayoutManager . Donc, si nous mettons la valeur sous la forme 1f le paramètre smoothScrollToPosition sera plus rapide que la valeur scrollToPosition.incrising, le délai et la diminution la vitesse de défilement ..

13
Ramz

Dans mon cas,

`mRecyclerView.scrollToPosition(10);` 

aussi n'a pas fonctionné . Mais 

`mRecyclerView.smoothScrollToPosition(10);` 

fonctionne bien pour moi ...

9
zephyr

Pour faire défiler l'écran vers le bas de n'importe quelle position dans RecyclerView, cliquez 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);
            }
        });

Essayez de mesurer la largeur ou la hauteur d'un élément et appelez smoothScrollBy (int dx, int dy).

1
Dubrovin

lorsque vous utilisez scrollToPosition , il apparaîtra au-dessus de la vue du recycleur.

Mais si vous utilisez smoothScrollToPosition , il défilera jusqu’à ce qu’il apparaisse dans Window Visible. Voilà pourquoi smoothScrool à l'élément ci-dessous, il sera affiché en bas

0
Chiam Simon V

Si vous essayez d'effectuer un défilement rapide vers une position située en haut de RecyclerView, utilisez simplement LinearLayoutManager.scrollToPositionWithOffset avec 0 comme décalage.

Exemple:

mLinearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(mLinearLayoutManager);

mLinearLayoutManager.scrollToPositionWithOffset(myPosition, 0);

smoothScrollToPosition est très lent. Si vous voulez quelque chose de rapide, utilisez scrollToPositionWithOffset.

0
live-love

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

Vous devez plutôt appeler la méthode de défilement du gestionnaire de disposition.

Cela devrait ressembler à quelque chose comme ça

mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition);
0
orelzion