2010-08-04 3 views
5

J'ai un listview avec un adaptateur de tableau personnalisé qui gère environ 15 chaînes. Le style de chaque ligne alterne (entre les étiquettes et les valeurs de ces étiquettes - par exemple, la ligne 1 pourrait être «adresse e-mail» et la ligne 2 serait l'adresse e-mail réelle). Je change le style de chaque ligne pour alterner comme cela dans la méthode getView() de arrayadapter. Donc, si l'élément à la position actuelle est une étiquette, je vais changer le style du style de ligne par défaut (qui est ce que les valeurs leur ont appliqué). Lorsque la liste est chargée, le style est parfait et je veux que ce soit le cas. Si je fais défiler la liste lentement vers le haut ou vers le bas, cela reste comme ça. Cependant, si je fais défiler la liste rapidement vers le haut et vers le bas, le style des lignes de valeur commence à changer pour celles des étiquettes jusqu'à ce que toutes les lignes aient le style d'une ligne d'étiquette. Est-ce que quelqu'un sait pourquoi cela se produirait? J'ai utilisé des adaptateurs personnalisés sur d'autres listes dans l'application sans problèmes comme celui-ci. Edit: Trouvé qu'il modifie également toutes les lignes au style d'étiquette sur les changements d'orientation portrait-> paysage. Ne fait pas cela sur les changements paysage-> portrait. Voici l'adaptateur que j'utilise. Est-ce que je manque quelque chose?Lorsque je fais défiler une liste avec un adaptateur personnalisé trop rapidement, getView() commence à se comporter bizarrement. Pourquoi?

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

Pouvez-vous montrer votre code getView? –

+0

Initialement, combien de lignes seront présentées lors du chargement de listview. La création d'une vue pour une ligne à l'aide de la méthode getview de customadapter est une tâche très gourmande en mémoire. C'est la raison du rendu brouillé de vos étiquettes. Écrire des aperçus de votre code .. Pourriez-vous obtenir une solution –

Répondre

7

Android réutilise vues assez agressive, et il est tout à fait possible qu'une vue qui a été utilisé comme une ligne d'adresse e-mail se réutilisé sur une ligne qui est censé afficher une étiquette, et vice-versa. En conséquence, vous ne pouvez pas compter sur les valeurs "par défaut". Réglez votre rembourrage, police de caractères, la taille du texte et la couleur de fond dans tous les cas:

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

Qui a fonctionné - merci. Je ne sais pas pourquoi je n'ai pas essayé ça ... – oliverwhite

+0

"Agressif" est un terme précis, je dirais! J'ai récemment été mordu par ce bug - que je dirais, dans Android. Il est logique pour eux de réutiliser la vue hors écran en tant que vue à l'écran, mais un développeur qui a reformaté des lignes dans getView() ne peut pas savoir ça! Peut-être que ArrayAdapter ou SimpleAdapter n'étaient pas faits pour ça, cependant. – electromaggot

+1

Donc +1 sur le commentaire de Marius! Une chose que je suggère est de faire des méthodes "saveFormat()" et "restoreFormat()" pour conserver les valeurs initiales de la ligne (les "valeurs par défaut" auxquelles Marius fait référence). Cela facilitera la maintenance future, car le format de ligne sera toujours par défaut à une place dans le XML. – electromaggot

4

Ne pas besoin de faire quoi que ce soit. Moi aussi face au même problème et résolu comme ceci:

Juste à l'intérieur de la méthode getView ajouter une première ligne

convertView=null; 

Il redessine coutume de la vue immédiatement détruite mais créerait de nouvelles à chaque fois en fonction de votre logique (même étrange ou autre)

+0

Cela a résolu le problème pour moi mais a rendu la liste de lecture incroyablement laggy. –

+0

Il me semble que cela devrait être la bonne réponse. Le mien n'a pas traîné (ce n'est pas vraiment si compliqué, cependant). –

Questions connexes