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!
Finalement, j'ai réussi à le faire fonctionner! LinearLayoutManager.scrollToPositionWithOffset(int, int)
a fait le tour.
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 ..
Dans mon cas,
`mRecyclerView.scrollToPosition(10);`
aussi n'a pas fonctionné . Mais
`mRecyclerView.smoothScrollToPosition(10);`
fonctionne bien pour moi ...
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).
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
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.
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);