Estoy usando básica RecyclerView con GridLayoutManager. He observado que ni smoothScrollToPosition ni scrollToPosition funciona correctamente.

a) cuando el uso de smoothScrollToPosition me reciben a menudo el error de RecyclerView

«RecyclerView﹕ Pasó sobre la posición de destino, mientras que el desplazamiento suave.»

y RecyclerView no se desplaza correctamente (a menudo se echa de menos la fila de destino). Esto se observa principalmente cuando estoy tratando de desplazamiento para el 1er elemento de algunas fila

b) cuando se utiliza scrollToPosition parece que funciona bastante bien, pero la mayoría del tiempo sólo puedo ver el 1er elemento de la fila y el resto no se muestran.

Me puede dar algunos consejos de cómo hacer el trabajo correctamente al menos uno de los métodos?

Muchas gracias!

10 Comentarios

  1. 62

    Finalmente fui capaz de hacer el trabajo! LinearLayoutManager.scrollToPositionWithOffset(int, int) hizo el truco.

    • Estoy teniendo un problema similar, y que el método hizo el truco para mí también… pero en realidad estoy tratando de implementar smoothScroll. Estás así?
    • Lo siento por la tarde respuesta: yo no era capaz de hacer el desplazamiento suave. Pero no era un requisito y en mi caso de desplazamiento rápido se ve mejor. De todos modos buena suerte y no te olvides de escribir aquí si que fueron un éxito! Muchas gracias.
    • Gracias @petrushka1986 funciona para mí también
    • El uso de gridLayoutManager.scrollToPositionWithOffset(index, 0) trabajado para mí también.
    • trabajo fino… Ex . layoutManager.scrollToPositionWithOffset(posición, 0);
    • Esto no señorita, pero usted no tiene la animación…
    • Sí, LayoutManager.scrollToPosition() no pueden trabajar bien, pero LinearLayoutManager.scrollToPositionWithOffset() es bueno 😀 es magia.
    • funciona correctamente, pero scrollistener no funciona. si desea detectar de desplazamiento, debe smoothScrollToPosition(int).
    • El uso típico es: LinearLayoutManager llm = (LinearLayoutManager) recyclerView.getLayoutManager(); llm.scrollToPositionWithOffset(10, 0); Pero tenga en cuenta que usted no obtendrá el desplazamiento suave de animación que smoothScrollToPosition() había.
    • La solución perfecta! Gracias. Funciona como un encanto
    • También confirmo que esta solución funciona perfectamente bien. scrolltoPosition era a menudo el desplazamiento a los elementos antes de lo que yo esperaba (incluso usando el valor de retorno de findFirstCompletelyVisibleItem..), pero la WithOffset versión funciona como un encanto! Gracias 🙂
    • impresionante! gracias
    • Siendo la única solución que funcionó bien después de 3 años.
    • wow, u son genuis

  2. 14

    También tengo el mismo problema, pero se las arregló para arreglar el problema de la Personalización de SmoothScroller

    vamos Personalizado LayoutManager de la siguiente

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

    (documentación comentó en el interior del código anterior)por Favor, elija el anterior LayoutManager
    a la recyerview

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

    mediante el administrador de Diseño personalizado

    scrollToPosition
    también funciona bien en mi caso u puede utilizar

    recyclerView.scrollToPosition(position)

    también si desea ajustar la velocidad de smoothScrollToPosition favor de anular la

    private static final float MILLISECONDS_PER_INCH = 50f;

    en CustomLayoutManager.
    Así que si ponemos el valor como 1f la smoothScrollToPosition será más rápido como scrollToPosition.el aumento de valor de hacer retraso y disminución hará que la velocidad de desplazamiento.
    Espero que esto le sea útil.

    • scrollToPositionWithOffset trabajado, pero para el desplazamiento suave necesitaba Ramz la respuesta.
  3. 12

    En Mi caso,

    `mRecyclerView.scrollToPosition(10);` 

    también no funciona.
    Pero

    `mRecyclerView.smoothScrollToPosition(10);` 

    funciona muy bien para mí…

  4. 6

    Para desplazarse hacia abajo a la parte inferior de cualquier posición en la RecyclerView clic en 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. 1

    Tratar de medición de punto de anchura o la altura y la llamada smoothScrollBy(int dx, int dy).

  6. 1

    recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,nueva RecyclerView.Estado(),currentPosition);

    • Gracias, esto funciona. simple y fácil.
  7. 1

    Cómo realizar el desplazamiento suave y guardar RecyclerView posición vertical después de la rotación:
    Este es el método que funciona para mi caso,

    public class MainFragment extends Fragment { //OR activity it's //fragment in my case
        ....
     @Override
        public void onLoadFinished(@NonNull Loader<List<Report>> loader, List<Report> objects) { //or other method of your choice, in my case it's a Loader 
        RecyclerView recyclerViewRv = findViewById(........;
             .....
        recyclerViewRv.setAdapter(.....Your adapter);
    
                recyclerViewRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);
                    }
    
                    @Override
                    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);
                        recyclerScrollY = recyclerViewRv. computeVerticalScrollOffset();
                    }
                });
    
        //Apply smooth vertical scroll
        recyclerViewRv.smoothScrollBy(0,recyclerScrollY);
    }
        //Save vertical scroll position before rotating devices
        @Override
            public void onSaveInstanceState(@NonNull Bundle outState) {
                super.onSaveInstanceState(outState);
                outState.putInt("recyclerScrollY",recyclerScrollY);
            }
    
        //BackUp vertical scroll position after rotating devices 
        @Override
            public void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                if(savedInstanceState != null) {
                    recyclerScrollY = savedInstanceState.getInt("recyclerScrollY");
                }
            }
    //If you want to perform the same operation for horizontal scrolling just add a variable called recyclerScrollX = recyclerScrollY = recyclerViewRv. computeHorizontalScrollOffset(); then save in bundle
  8. 0

    Llamar a la recyclerView smoothScroll no es eficaz, como la recyclerView sí no controla su distribución.

    Lo que debe hacer es llamar al gestor de diseño método de desplazamiento en su lugar.

    Esto debería ser algo como esto

    mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition);
    • He probado esto, pero los problemas persisten. Debería funcionar, pero no de cualquier manera.
    • RecyclerView rutas que el desplazamiento de las llamadas a su LayoutManager por lo tanto esto no cambiaría nada, excepto introducir un potencial de NPE.
  9. 0

    Si usted está tratando de hacer un rápido desplazamiento a una posición en la parte superior de la RecyclerView, sólo tiene que utilizar LinearLayoutManager.scrollToPositionWithOffset con 0 como el desplazamiento.

    Ejemplo:

    mLinearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(mLinearLayoutManager);
    
    mLinearLayoutManager.scrollToPositionWithOffset(myPosition, 0);

    smoothScrollToPosition es muy lento. Si quieres algo rápido ir con scrollToPositionWithOffset.

    • no funciona para mí.
  10. 0

    cuando se utiliza scrollToPosition se mostrará en la parte superior de la reciclador de vista.

    Pero si uso smoothScrollToPosition se va a desplazar hasta que se ven en la Ventana Visible. es por eso que mientras smoothScrool el artículo a continuación, se mostrará en la parte inferior

Dejar respuesta

Please enter your comment!
Please enter your name here