[ES] Scroll infinito en un LongListSelector [UniversalApps]

A veces resultamos tan creativos que nuestro yo futuro se acordará de nosotros con toda su mala fé. Eso me pasó recientemente a mí, con mi yo pasado. Digamos que en cierto momento de un proyecto me pareció una idea espectacular cargar progresivamente los elementos de un LongListSelector y de esa forma no esperar a que la lista estuviera cargada completamente e irle dando al usuario ciertos items de la lista ya.

Esto estaba muy bien cuando los datos eran acotados pero llegó un momento en que quisimos evolucionar más la lista de la app y por lo tanto conectarla a una api y que esta nos fuera dando los siguientes elementos.

Todas las soluciones para implementar el scroll infinito en el LongListSelector incluyen el uso del evento ItemRealized pero en nuestro caso ya habíamos agotado esta posibilidad para la carga progresiva, así que tendríamos que sacarnos de la manga una nueva forma de la manga de averiguar cuando se está llegando al final de la lista visible y de esta forma poder llamar al servicio.

A grandes males, grandes remedios

De este modo, ¿cómo podíamos saber la posición de la lista en la que se encuentra el usuario y cuando cargar los datos?

Pues optamos por una forma más bien poco ortodoxa para poder implementar el scroll infinito, dado que además queríamos cargar los datos antes de que el usuario hiciera la compresión (si alguien está interesado en conocer esta forma, que se ponga en contacto conmigo y la vemos también). Así que primero de todo queremos evaluar la manipulación de la lista y por ello estaremos pendientes del evento ManipulationStarted

Y la magia negra la tendremos en el evento. El objeto e con los argumentos del evento nos traerá el elemento de la lista que ha generado el evento, puede ser cualquier elemento de la plantilla de los item o la propia lista. En este punto necesito saber qué si ha sido un elemento de la lista, cual ha sido, y para eso tengo una función SearchParentItemControl que bucea a través del elemento que lanzó el evento y me busca en cuestión el item de la lista. Si lo encuentra me lo devuelve y si no, deja la salida a null. Además de esto la lista debe ser mayor que el número a partir del que quiero actualizar, quiero decir, si quiero que se actualice cuando se esté en los 5 últimos elementos, la lista debe ser superior a 5 al menos. Si no, está claro que en la primera carga no había más elementos que cargar y por tanto no tendría mucho sentido intentar cargar una segunda página.

Por último, si el elemento que fue tocado para generar el movimiento está dentro de mi offSet (por ejemplo, my offset es de 5 y toco el elemento 16 de 20) realizamos la llamada para pedir la segunda página de datos.

Sin lugar a dudas no es para nada una solución ortodoxa, y sería más práctico poder saber si una vez realizado un slide de abajo a arriba qué elementos de la lista están en pantalla, pero dado que no existe esa posibilidad hay que crear soluciones un poco extravagantes.