viewtype viewholder studio recyclerview que practices implement ejemplo best android android-recyclerview

android - viewholder - Detectar el inicio de desplazamiento y el final de desplazamiento en recyclerview



recyclerview viewholder android (4)

Necesito detectar el inicio / final y la dirección del desplazamiento en una vista de reciclaje. El detector de desplazamiento tiene dos métodos: onScrolled() y onScrollStateChanged() . El primer método se llama después de que se inicia el desplazamiento (de hecho se llama onScrolled () y no onScrolling ()). El segundo método proporciona información sobre el estado pero no tengo la información de dirección. ¿Cómo puedo lograr mi objetivo?


Aquí está la solución completa para realizar una acción después de que se haya detenido el desplazamiento (para RecyclerView)

que ha corregido mi excepción OutOfBounds relacionada con el desplazamiento recyclerView

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { //Your action here } });


Consulte la documentación de onScrollStateChanged(int state) . Los tres valores posibles son:

  • SCROLL_STATE_IDLE : No se realiza ningún desplazamiento.
  • SCROLL_STATE_DRAGGING : El usuario está arrastrando su dedo en la pantalla (o se está haciendo mediante programación).
  • SCROLL_STATE_SETTLING : El usuario levantó el dedo y la animación ahora se está desacelerando.

Entonces, si desea detectar cuándo comienza y finaliza el desplazamiento, puede crear algo como esto:

public void onScrollStateChanged(int state) { boolean hasStarted = state == SCROLL_STATE_DRAGGING; boolean hasEnded = state == SCROLL_STATE_IDLE; }


La forma más fácil de hacerlo es sacar su layoutManager. Por ejemplo

private RecyclerView.OnScrollListener mListener = new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); GridLayoutManager layoutManager=GridLayoutManager.class.cast(recyclerView.getLayoutManager()); int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); int pastVisibleItems = layoutManager.findFirstCompletelyVisibleItemPosition(); if(pastVisibleItems+visibleItemCount >= totalItemCount){ // End of the list is here. Log.i(TAG, "End of list"); } } }

¡Espero eso ayude!


paso 1 Puedes crear una clase extendiendo RecyclerView.OnScrollListener y anular estos métodos

public class CustomScrollListener extends RecyclerView.OnScrollListener { public CustomScrollListener() { } public void onScrollStateChanged(RecyclerView recyclerView, int newState) { switch (newState) { case RecyclerView.SCROLL_STATE_IDLE: System.out.println("The RecyclerView is not scrolling"); break; case RecyclerView.SCROLL_STATE_DRAGGING: System.out.println("Scrolling now"); break; case RecyclerView.SCROLL_STATE_SETTLING: System.out.println("Scroll Settling"); break; } } public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (dx > 0) { System.out.println("Scrolled Right"); } else if (dx < 0) { System.out.println("Scrolled Left"); } else { System.out.println("No Horizontal Scrolled"); } if (dy > 0) { System.out.println("Scrolled Downwards"); } else if (dy < 0) { System.out.println("Scrolled Upwards"); } else { System.out.println("No Vertical Scrolled"); } } }

paso 2- Dado que setOnScrollListener está en desuso Es mejor usar addOnScrollListener

mRecyclerView.addOnScrollListener(new CustomScrollListener());