2012-07-12 4 views
10

Ho un listView personalizzato che contiene un'intestazione bloccata e x quantità di viste "push-up", che possono essere spostate verso l'alto e nascoste sopra la vista elenco.ListView personalizzato con intestazione appuntata, che causa Jank durante l'impostazione del padding

Ho allegato un'immagine per spiegarle. Ci scusiamo per la "censura nera", solo per nascondere il logo del cliente ecc.

Il mio problema è che se aggiungo un padding alla vista Header appuntato, otterrò gli oggetti listview galleggianti dietro di esso.

La vista dell'intestazione fissata, è implementata con la stessa tecnica che si troverà se si cerca PinnedHeaderListView, ovvero una vista statica e un'intestazione nella lista.

Ho trovato un modo per abilitare il padding, e cioè applicando lo stesso padding dell'intestazione pinata, al listView attuale, ma solo quando l'intestazione statica è visibile.

Tuttavia, la chiamata di setPadding causa un Jank abbastanza visibile che vorrei rimuovere. Qualcuno ha qualche idea su come rimuovere questo jank?

Ho una semplice applicazione con viste semplici e dati fittizi, che non mostra questo jank, quindi forse la quantità di jank dipende dalla complessità dei layout di cella.

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()); 
    } 
} 

Primo Ecco l'immagine che mostra le intestazioni spinto-up showing the pushed-up headers

Ecco un'immagine che mostra come le cose vengono trascinati dietro la vista appuntato statica imbottita. Vale la pena notare che funziona come previsto se aggiusto il padding di listView, ma otterrò Jank (rallentamento), al momento dell'accensione/spegnimento della vista statica dell'intestazione.

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

+5

+1 per immagini molto belle, opere d'arte fantastiche :) –

+0

plz è fuori dalla tua domanda, ma mi diresti come hai organizzato la tua listview e il layout dell'applicazione? – Angelika

risposta

0

Poiché setPadding sul listView causerà topografie chiamate, sarà molto ineffecient, soprattutto nei casi con cellule Listview complesse. Una soluzione consiste nell'aggiungere l'immagine di sfondo all'intestazione bloccata che rappresenta il padding necessario. Ciò significa che l'intera intestazione bloccata è solida. Gli elementi della vista elenco verranno quindi disegnati dietro questa grafica. Questa è la soluzione alla quale siamo finiti.

Funziona, ma sarebbe meglio ritagliare listView.

1

bisogno di alcune ulteriori informazioni sulla vostra domanda.

Con la mia comprensione Jank è dovuta all'enorme quantità di dati e disegnabili che si stanno utilizzando.

Provare ad abilitare l'accelerazione hardware per la visualizzazione.

Per ulteriori sull'accelerazione HW provare questo http://developer.android.com/guide/topics/graphics/hardware-accel.html