2010-08-04 8 views
5

Ho un listview con un arrayadapter personalizzato che gestisce circa 15 stringhe. Lo stile di ogni riga si alterna (tra etichette e valori per quelle etichette - ad esempio la riga 1 potrebbe essere "indirizzo email" e la riga 2 sarebbe l'indirizzo email effettivo). Sto cambiando lo stile di ogni riga per alternare in questo modo nel metodo getView() dell'arrayadapter. Quindi se l'articolo nella posizione corrente è un'etichetta, cambierò lo stile dallo stile di riga predefinito (che è quello che i valori hanno applicato a loro). Quando la listview viene caricata per la prima volta, lo styling è perfetto e proprio come voglio che sia. Se faccio scorrere l'elenco lentamente verso l'alto o verso il basso, rimane in questo modo. Tuttavia, se faccio scorrere l'elenco rapidamente verso l'alto e verso il basso, lo stile delle righe dei valori inizia a cambiare a quello delle etichette finché tutte le righe hanno lo stile di una riga di etichette. Qualcuno sa perché questo sarebbe successo? Ho usato adattatori personalizzati su altre visualizzazioni di elenco nell'app senza problemi come questo.Quando scorro un listview con un adattatore personalizzato troppo veloce su e giù, getView() inizia a comportarsi in modo strano. Perché?

Modifica: è stato rilevato che modifica anche tutte le righe dello stile dell'etichetta in verticale -> modifiche all'orientamento orizzontale. Non lo fa su landscape-> portrait changes. Di seguito è riportato l'adattatore che sto utilizzando. Mi sto perdendo qualcosa?

public class DetailsAdapter extends ArrayAdapter<String> { 

private TextView text = null; 
private String item = null; 

public DetailsAdapter(Context context, int resource, int textViewResourceId, String[] objects) { 
    super(context, resource, textViewResourceId, objects); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    text = (TextView) super.getView(position, convertView, parent); 
    item = getItem(position); 
    if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
     text.setBackgroundColor(0xFF575757); 
     text.setTextSize(15); 
     text.setTypeface(null, Typeface.BOLD); 
     text.setPadding(8, 5, 0, 5); 
    } else { 
     text.setPadding(15, 15, 0, 15); 
    } 
    return text; 
} 

@Override 
public boolean isEnabled(int position) { 
    item = getItem(position); 
    if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
     return false; 
    } else { 
     return true; 
    } 
} 
} 
+0

Puoi mostrare il tuo codice getView? –

+0

Inizialmente quante righe verranno presentate quando viene caricato listview. La creazione di una vista per una riga utilizzando il metodo getview di customadapter è un'attività che richiede molta memoria. Questo è il motivo per il rendering confuso delle tue etichette. Scrivi scorci del tuo codice .. Potrebbe essere una soluzione –

risposta

7

Android riutilizza vista abbastanza aggressivo, ed è possibile che una vista che è stato utilizzato come un indirizzo di riga viene riutilizzato su una riga che dovrebbe visualizzare un'etichetta, e viceversa.

Di conseguenza, non è possibile fare affidamento su valori "predefiniti". Imposta padding, tipo di carattere, dimensione del testo e colore di sfondo in tutti i casi:

if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { 
    text.setBackgroundColor(0xFF575757); 
    text.setTextSize(15); 
    text.setTypeface(null, Typeface.BOLD); 
    text.setPadding(8, 5, 0, 5); 
} else { 
    text.setBackgroundColor(DEFAULT_BACKGROUND); 
    text.setTextSize(DEFAULT_TEXT_SIZE); 
    text.setTypeface(null, DEFAULT_TYPEFACE); 
    text.setPadding(15, 15, 0, 15); 
} 
+0

Che ha funzionato - grazie. Non so perché non l'ho provato ... – oliverwhite

+0

"Aggressivo" è un termine preciso, direi! Recentemente sono stato morso da questo bug, che chiamerei, in Android. Ha senso riutilizzare la vista andando fuori campo come una vista che appare sullo schermo, ma non ci si può aspettare che uno sviluppatore che ha riformattato le righe in getView() lo sappia! Forse ArrayAdapter o SimpleAdapter non erano pensati per questo, comunque. – electromaggot

+1

Quindi +1 sul commento di Marius! Una cosa che suggerirei è di fare i metodi "saveFormat()" e "restoreFormat()" per mantenere i valori iniziali della riga (i "valori di default" a cui Marius si riferisce). Ciò faciliterà la manutenzione futura, in quanto il formato della riga sarà sempre predefinito in un posto nell'XML. – electromaggot

4

Non devi fare nulla. Anche ho affrontato lo stesso problema e risolto in questo modo:

Appena dentro il metodo GetView aggiungere una prima linea

convertView=null; 

E 'abitudine ridisegna la vista immediatamente distrutto, ma invece sarebbe crearne di nuovi ogni volta, sulla base di logica (anche dispari o altro)

+0

Questo ha risolto il problema per me, ma ha reso la listview incredibilmente laggy. –

+0

A me sembra che questa dovrebbe essere la risposta corretta. Il mio non è rimasto indietro (non è poi così complicato, però). –

Problemi correlati