recyclerview more endless android android-recyclerview endlessscroll

android - more - recyclerview endless scroll using pagination



¿Por qué RecyclerView.OnScrollListener no es una interfaz sino una clase abstracta? (4)

Para implementar el patrón de desplazamiento sin fin en RecyclerView , quiero crear una clase como

public class EndlessScrollAdapter<VH extends ViewHolder> extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener { }

Debido a que EndlessScrollAdapter debe ser responsable del manejo de los datos y del evento de desplazamiento, esta es la forma más conveniente de implementarlo.

Pero, porque en recyclerview-v7-21.0.3 , OnScrollListener declaró así

/** * An OnScrollListener can be set on a RecyclerView to receive messages * when a scrolling event has occurred on that RecyclerView. * * @see RecyclerView#setOnScrollListener(OnScrollListener) */ abstract static public class OnScrollListener { /** * Callback method to be invoked when RecyclerView''s scroll state changes. * * @param recyclerView The RecyclerView whose scroll state has changed. * @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE}, * {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}. */ public void onScrollStateChanged(RecyclerView recyclerView, int newState){} /** * Callback method to be invoked when the RecyclerView has been scrolled. This will be * called after the scroll has completed. * * @param recyclerView The RecyclerView which scrolled. * @param dx The amount of horizontal scroll. * @param dy The amount of vertical scroll. */ public void onScrolled(RecyclerView recyclerView, int dx, int dy){} }

No puedo hacer que EndlessScrollAdapter implemente OnScrollListener .

Entonces, como dice el título, ¿hay alguna buena razón para que OnScrollListener sea ​​una clase en lugar de una interfaz? Porque creo que debería ser una interfaz.


No puedo hacer que EndlessScrollAdapter implemente OnScrollListener.

Es cierto, pero puede tener una clase dedicada que extends RecyclerView.OnScrollListener (una instancia concreta de RecyclerView.OnScrollListener ). P.ej

private class MyScrollListener extends RecyclerView.OnScrollListener { // abstract methods implemenations }

y lo que necesitas es justo

mRecyclerView.addOnScrollListener(new MySCrollListener());


La idea de evitar establecer el oyente en tu metdod.

... recyclerView.addOnScrollListener(new ScrollListener()); ...

y crear una clase de oyente interno

private class ScrollListener extends RecyclerView.OnScrollListener { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState){ // your code there } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // your code there } }


Tuve la misma pregunta, y es definitivamente como fue diseñada, como se responde en este informe de error:

https://code.google.com/p/android/issues/detail?id=79283

Las clases abstractas permiten a los marcos agregar nuevos métodos sin romper las implementaciones existentes.

También el dif que lo introdujo se puede encontrar aquí:

https://android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/

Este cambio agrega RecyclerView como un primer parámetro a las devoluciones de llamada relacionadas con el desplazamiento.

También soluciona un error en el que la devolución de llamada de desplazamiento se llamaba con la cantidad de desplazamiento deseada en lugar de la cantidad de desplazamiento real.

También lo cambié para que fuera una clase abstracta en lugar de una interfaz para facilitar los cambios futuros.

No estoy seguro de estar de acuerdo con el cambio, personalmente, pero ya está.


yourRecyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); } });