Listas grandes
El caso concreto donde se junta todo: mostrar cien mil elementos sin agotar la memoria, sin bloquear la interfaz y sin traerlos todos por el puente.
Las cuatro piezas
Las cuatro juntas son lo que hace que una lista de cualquier tamaño se comporte igual que una de veinte. Y las cuatro son necesarias: virtualizar sin paginar sigue trayendo todo por el puente, y paginar sin virtualizar sigue llenando el árbol.
La forma completa
El paso 1 es el que se olvida y es lo que permite que la barra de desplazamiento tenga el tamaño correcto sin haber traído nada.
Los detalles que se notan
Cuatro cosas que separan una lista virtualizada correcta de una que se siente rara:
- El margen a cada lado. Pedir exactamente lo visible produce huecos en blanco al desplazar rápido. Un margen de una pantalla arriba y abajo lo evita.
- Altura de fila conocida o medida. Si las filas tienen alturas distintas y no se miden, el cálculo del área se desajusta y la barra de desplazamiento salta.
- Estado de carga por fila, no global: una fila que aún no ha llegado muestra un marcador, no bloquea la lista entera.
- Y el desplazamiento debe ser fluido: el trabajo de pedir datos no puede ocurrir en el manejador del desplazamiento sin agrupar. Nivel 40.4.
El segundo es el que más problemas da en listas con contenido de altura variable, y la solución habitual es medir las filas al pintarlas e ir corrigiendo la estimación.
Selección y navegación
Lo que hay que resolver aparte, porque la virtualización lo complica:
- La selección se guarda por identificador, no por posición ni por referencia al nodo — que puede no existir.
- Seleccionar todo no puede significar traer todo: es un estado —«todos menos estos»— que el core entiende.
- Y navegar con teclado tiene que poder llegar a filas que no están pintadas: mover la selección, calcular la posición y desplazar hasta ahí.
El segundo es el que rompe las implementaciones ingenuas: «seleccionar todo» en una lista de cien mil elementos no puede producir una lista de cien mil identificadores cruzando el puente.