Scroll tipo Twitter en un ListView

Hace poco me he visto en el caso de un ListView con una gran cantidad de datos, muchos de ellos antiguos y que puede que el usuario no vea por no hacer scroll pero si que va a tener que sufrir el tiempo de espera para descargar todos esos datos. Para solucionarlo vamos a ver como hacer un listview que cargue items a medida que hacemos scroll.

La idea la he cogido de este blog http://benjii.me/2010/08/endless-scrolling-listview-in-android/ y la he modificado un poco para que sea más fácil de utilizar en todas partes. Al final debe hacer como la app de Twitter si hacemos scroll en nuestra lista debe cargar más elementos al llegar al final de ella.

Simplemente debemos crear una clase que implemente OnScrollListener. Este sobreescribirá el método onScroll, donde se va  a comprobar con los items que se están mostrando actualmente si estamos llegando al final de la lista. En caso afirmativo se lanzará un listener que hemos creado.

El listener que se lanza lo creamos en la propia clase y nos servirá para avisar a quien corresponda cada vez que se tenga que leer una página más. Además nos devolverá la página que debemos cargar.

public class EndlessScrollListener implements OnScrollListener{
    private int visibleThreshold = 5;
    private int currentPage = 0;
    private int previousTotal = 0;
    private boolean loading = true;
    private onScrollEndListener onScrollEnd;
    
    public interface onScrollEndListener {void onEnd(int page);}
    
    public EndlessScrollListener(onScrollEndListener onScrollEnd) {
     super();
     this.onScrollEnd = onScrollEnd;
    }
    public EndlessScrollListener(int visibleThreshold, onScrollEndListener onScrollEnd) {
     super();
        this.visibleThreshold = visibleThreshold;
        this.onScrollEnd = onScrollEnd;
    }

    
 @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
                currentPage++;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            loading = true;    
            if(totalItemCount > visibleThreshold)
             onScrollEnd.onEnd(currentPage);
        }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {     
    }
    
  
}


Ahora utilizarlo en cualquiera de nuestros ListView o cualquier otro elemento que se pueda implementar el onScrollListener es un juego de niños. Simplemente debemos hacer algo así:

ListView List = (ListView) findViewById(R.id.list);
List.setOnScrollListener(new EndlessScrollListener(new onScrollEndListener() {  @Override
 public void onEnd(int page) {    
  //Hacemos una llamada a nuestro servicio web para traer más datos 
 }
}));



Ya hemos visto otras veces como traer datos de un servidor, y también como enlazar datos a un Listview, así que solo es cuestión de que juntéis todas las piezas para tener esta funcionalidad en vuestras listas.

Comments are closed.