(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!
6 réponses
finalement j'ai réussi à faire en sorte que ça marche! LinearLayoutManager.scrollToPositionWithOffset(int, int)
a fait l'affaire.
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.
Dans Mon cas,
`mRecyclerView.scrollToPosition(10);`
aussi, n'a pas de travail. Mais
`mRecyclerView.smoothScrollToPosition(10);`
fonctionne très bien pour moi...
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);
}
});
essayez de mesurer la largeur ou la hauteur de l'article et appelez smoothScrollBy(int DX, int dy).
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);