2012-07-12 16 views
10

Tengo un listView personalizado que contiene un encabezado anclado, y x cantidades de vistas "push-up", que se pueden subir y ocultar encima de la vista de lista.Vista de lista personalizada con encabezado fijo, que causa Jank al configurar el relleno

He añadido una imagen para explicarlas. Perdón por la "censura negra", solo para ocultar el logotipo de los clientes, etc.

Mi problema es que si agrego un relleno a la vista del Encabezado clavado, obtendré los elementos listview flotando detrás de él.

La vista de encabezado fijada se implementa con la misma técnica que encontrará si busca PinnedHeaderListView, es decir, una vista estática y un encabezado en la vista de lista.

He encontrado una manera de habilitar el relleno, es decir, aplicando el mismo relleno que el encabezado fijado, al listView real, pero solo cuando el encabezado estático está visible.

Sin embargo, la invocación de setPadding causa un Jank bastante visible que me gustaría eliminar. ¿Alguien tiene alguna idea de cómo eliminar este jank?

Tengo una aplicación simple con vistas simples y datos ficticios, que no muestra este jank, por lo que tal vez la cantidad de jank depende de la complejidad de los diseños de las celdas.

private void updateIfShouldShowStaticHeaderView() { 

    //unfortunately setting the padding of the listView causes JANK. 

    //any ideas? 
    int bottomOfFloatingHeader = floatingHeader.getBottom(); 
    if (bottomOfFloatingHeader < mHeaderViewHeight) { 
     staticHeaderViewIsVisible = true; 
     staticHeader.setVisibility(View.VISIBLE); 

     //need to set padding of listView to avoid having list-view items float behind my padded static header 
     setPadding(0, staticHeader.getPaddingTop(), 0, getPaddingBottom()); 
    } else { 
     staticHeaderViewIsVisible = false; 
     staticHeader.setVisibility(View.INVISIBLE); 
     //need to set padding of listView to avoid having list-view items float behind my padded static header 
     setPadding(0, 0, 0, getPaddingBottom()); 
    } 
} 

En primer lugar aquí es la imagen que muestra las cabeceras hundida hasta showing the pushed-up headers

Aquí está una imagen que muestra cómo las cosas se ven inmersos detrás de la vista clavada estática acolchada. Vale la pena observar que funciona como se requiere si ajusto el relleno de listView, pero obtendré Jank (ralentización), en el momento en que enciende/apaga la vista de cabecera estática.

showing the error that is visible if I do not adjust padding

+5

+1 para imágenes muy bonitas, buen trabajo de arte :) –

+0

por favor, no es cuestión suya, pero ¿podría decirme cómo organizó su lista de listas y el diseño de la aplicación? – Angelika

Respuesta

0

Desde setPadding en la vista de lista hará que los esquemas de llamadas, que va a ser muy ineficiente, especialmente en los casos con células Listview complejas. Una solución es agregar el gráfico de fondo al encabezado fijado que representa el relleno que se necesita. Esto significa que todo el encabezado fijado es sólido. Los elementos de la vista de lista se dibujarán detrás de estos gráficos. Esta es la solución con la que terminamos.

Funciona, pero sería mejor recortar listView.

Cuestiones relacionadas