inicio

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.

0
The following two tabs change content below.
Técnico en Administración de Sistemas y Desarrollo de Aplicaciones. Amigo de sus amigos, y una mente inquieta que no puede dejar un ordenador de lado porque necesita programar aplicaciones Android o aplicaciones en general, además de páginas web. Nuestro programador de cabecera y espero que también el vuestro.
  • Jhonny Ly

    Hola, disculpa, tengo un error cuando se llama al constructor de EndlessScrollListener:

    “The constructor EndlessScrollListener(new onScrollEndListener(){}) is undefined”

    Y no comprendo si tengo que llamar al metodo donde se cargan todos los datos o tengo que crear otro metodo que solo carge cierta cantidad cada vez que llegue al final?

    Gracias de antemano.
    Saludos!

    • 3pi3s

      Buenas,

      Si lo estás llamando tal cual lo pones en tu pregunta no está correcto. Instancia el objeto tal cual lo puse yo.

      Por otro lado. En ese ejemplo, hay un método “onEnd” que es el que le dice a la aplicación que ha llegado al final del scroll y que obtenga más items. Además, fíjate que se le pasa un parámetro “page” para que puedas saber cual es el número de página siguiente. Ahí es donde debes cargar más datos.

      La llamada para obtener más objetos, ya depende de tus necesidades, del origen de datos, etc… pero a grandes rasgos, deberías implementar un método que busque datos paginados y los vaya añadiendo al listview donde los visualices.

      Un saludo,

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR