(Smooth) ScrollToPosition ne fonctionne pas correctement avec RecyclerView

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

A) lorsque vous utilisez smoothScrollToPosition je reçois souvent une erreur de RecyclerView

  • Application Web hors ligne HTML5 sur Android
  • Comment utiliser une police personnalisée avec WebView
  • Qu'est-ce que packageContext in Intent # (Context packageContext, Class <?> Cls)?
  • AsyncTask onPostExecute n'est jamais appelé
  • Ouverture du fichier html local avec le navigateur Android
  • Comment résoudre l'erreur onClientConnectionState () - status = 22 clientIf = 7 dans BLE
  • "RecyclerView: Passé sur la position cible tout en défilant en douceur".

    Et RecyclerView ne se déroule pas correctement (souvent il manque la ligne ciblée). Ceci est surtout observé lorsque j'essaie de passer au 1er élément d'une rangée

    B) lorsque vous utilisez scrollToPosition cela semble fonctionner tout à fait correct, mais la plupart du temps je ne vois que le 1er élément de la ligne et le reste n'est pas affiché.

    Pouvez-vous m'indiquer comment faire fonctionner correctement au moins une des méthodes?

    Merci beaucoup!

  • La recherche de la barre d'action ne se ferme pas après la recherche
  • Récepteur comme classe interne dans Android
  • Android: Existe-t-il des appareils de densité xxxhdpi?
  • Google TV - est-il conçu pour une efficacité aussi importante que celle des combinés / tablettes?
  • Comment définir la couleur d'arrière-plan d'une vision de texte comme une lumière verte verte via XML?
  • Comment puis-je ajouter un compte Google existant sur un appareil Android à partir de la ligne de commande?
  • 6 Solutions collect form web for “(Smooth) ScrollToPosition ne fonctionne pas correctement avec RecyclerView”

    Finalement, j'ai pu le faire fonctionner! LinearLayoutManager.scrollToPositionWithOffset(int, int) fait l'affaire.

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

    Laissez 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); } } 

    (La documentation a commenté dans le code indiqué ci-dessus) Veuillez configurer 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é

    ScrollToPosition fonctionne également bien dans mon cas, vous pouvez utiliser

     recyclerView.scrollToPosition(position) 

    Également si vous souhaitez ajuster la vitesse de smoothScrollToPosition, veuillez remplacer le

     private static final float MILLISECONDS_PER_INCH = 50f; 

    Dans CustomLayoutManager. Donc, si nous mettons la valeur en 1f, smoothScrollToPosition sera plus rapide que la valeur de scrollToPosition.increasing, rendez-vous retardé et diminuez la vitesse de défilement. J'espère que cela sera utile.

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

    Dans mon cas,

     `mRecyclerView.scrollToPosition(10);` 

    N'a pas non plus fonctionné. Mais

     `mRecyclerView.smoothScrollToPosition(10);` 

    Ça marche bien pour moi …

    Appeler le recyclerVisir smoothScroll n'est pas efficace, car le recyclerView ne gère pas sa mise en page.

    Ce que vous devez faire, c'est appeler la méthode de défilement du gestionnaire de mise en page à la place.

    Cela devrait ressembler à quelque chose comme ça

     mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition); 

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

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.