Después de de nuestra larga compilación de datos resolvimos este atascamiento que tienen muchos los usuarios. Te regalamos la respuesta y nuestro objetivo es resultarte de gran ayuda.
Solución:
Gracias a @Kushal y así es como lo implementé
private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount;
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
if (dy > 0) //check for scroll down
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
if (loading)
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount)
loading = false;
Log.v("...", "Last Item Wow !");
// Do pagination.. i.e. fetch new data
loading = true;
);
No olvides agregar
LinearLayoutManager mLayoutManager;
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
Haz estas variables.
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 5;
int firstVisibleItem, visibleItemCount, totalItemCount;
Establecer en Desplazamiento para la vista del reciclador.
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = mRecyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
if (loading)
if (totalItemCount > previousTotal)
loading = false;
previousTotal = totalItemCount;
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold))
// End has been reached
Log.i("Yaeye!", "end called");
// Do something
loading = true;
);
Nota : Asegúrate de estar usando
LinearLayoutManager
como administrador de diseño paraRecyclerView
.
LinearLayoutManager mLayoutManager;
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
y para una cuadrícula
GridLayoutManager mLayoutManager;
mLayoutManager = new GridLayoutManager(getActivity(), spanCount);
mRecyclerView.setLayoutManager(mLayoutManager);
Diviértete con tus pergaminos sin fin !! ^. ^
Actualizar : mRecyclerView.
setOnScrollListener ()está en desuso, simplemente reemplácelo conmRecyclerView.addOnScrollListener()
¡Y la advertencia se habrá ido! Puede leer más de esta pregunta SO.
Dado que Android ahora es compatible oficialmente con Kotlin, aquí hay una actualización para el mismo:
Hacer OnScrollListener
class OnScrollListener(val layoutManager: LinearLayoutManager, val adapter: RecyclerView.Adapter, val dataList: MutableList) : RecyclerView.OnScrollListener()
var previousTotal = 0
var loading = true
val visibleThreshold = 10
var firstVisibleItem = 0
var visibleItemCount = 0
var totalItemCount = 0
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int)
super.onScrolled(recyclerView, dx, dy)
visibleItemCount = recyclerView.childCount
totalItemCount = layoutManager.itemCount
firstVisibleItem = layoutManager.findFirstVisibleItemPosition()
if (loading)
if (totalItemCount > previousTotal)
loading = false
previousTotal = totalItemCount
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold))
val initialSize = dataList.size
updateDataList(dataList)
val updatedSize = dataList.size
recyclerView.post adapter.notifyItemRangeInserted(initialSize, updatedSize)
loading = true
y agréguelo a su RecyclerView así
recyclerView.addOnScrollListener(OnScrollListener(layoutManager, adapter, dataList))
Para obtener un ejemplo de código completo, no dude en consultar este repositorio de Github.
Para aquellos que solo quieren recibir una notificación cuando el último elemento se muestra por completo, puede usar View.canScrollVertically()
.
Aquí está mi implementación:
public abstract class OnVerticalScrollListener
extends RecyclerView.OnScrollListener
@Override
public final void onScrolled(RecyclerView recyclerView, int dx, int dy)
if (!recyclerView.canScrollVertically(-1))
onScrolledToTop();
else if (!recyclerView.canScrollVertically(1))
onScrolledToBottom();
else if (dy < 0)
onScrolledUp();
else if (dy > 0)
onScrolledDown();
public void onScrolledUp()
public void onScrolledDown()
public void onScrolledToTop()
public void onScrolledToBottom()
Nota: puede utilizar recyclerView.getLayoutManager().canScrollVertically()
si desea admitir API <14.
Puedes amparar nuestra ocupación añadiendo un comentario o puntuándolo te estamos eternamente agradecidos.