2010-11-12 32 views
0

Im changer la couleur d'arrière-plan de chaque ligne remplaçant onListItemClick avec ce morceau de codeListView couleur backgroung pour chaque ligne android

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
// First time touching the item 
if(mLastPosition==-1) { 
    mLastPosition = position; 
} else { 
    mLocalBG.remove(String.valueOf(mLastId)); 
    v = l.getChildAt(mLastPosition); 
    v.setBackgroundColor(Color.WHITE); 
    mLastPosition = position; 
} 
mLocalBG.add(String.valueOf(id)); 
/* The issue: v is returning null right here, but only when touch a row that was below the first ones displayed, rows that needed to be scrolled down */ 
v = l.getChildAt(position); 
v.setBackgroundColor(Color.LTGRAY); 
} 

Comme il est indiqué, il fonctionne parfaitement jusqu'à ce que je défiler vers le bas les lignes suivantes, après View v renvoie null à chaque fois. Pourquoi cela se passe-t-il?

Merci à l'avance

+0

Aide pleaseeeeee –

Répondre

0

Ajout de plus d'informations:

à mon humble avis, ce qui se passe probablement dans les lignes qui newView n'a pas été appelé. :/

+0

Est-ce que je fais quelque chose de stupide? = / –

0

Eh bien, c'est ans, mais cette ligne ne fait pas ce que vous pensez qu'il fait:

v = l.getChildAt(position); 

Voir ViewGroup#getChildAt(). Cette méthode n'est pas substituée pour ListView (bien qu'elle devrait peut-être l'être) et ne vous donne que des vues visibles. Pourquoi? Les vues hors-scroll n'existent pas! Rappelez-vous, la même poignée de vues sont recyclées pour économiser la mémoire au détriment de l'étrangeté comme ça.

Essayez ceci:

v = l.getChildAt(position - l.getFirstVisiblePosition()); 

Vous aurez également besoin de mettre getView() de l'arrière-plan correct dans votre adaptateur.