Saltar al contenido

¿Cómo implementar una lista sin fin con RecyclerView?

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 para RecyclerView.

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 con mRecyclerView.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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *