2

Le problème que j'espère résoudre ici est que lorsque je clique sur un élément dans le ListView l'arrière-plan de l'élément change en gris clair, mais quand je continue à faire défiler la liste tous les 4ème élément a l'arrière-plan changé en gris clair, même si ces autres éléments n'ont pas été cliqués. Comment est-ce que je fais seulement l'article que j'ai cliqué être effectué par le clic?Problème de sélection ListView ... Utilisation de onItemClick (parent AdapterView <?>, affichage vue, ...)

ListView lv = (ListView) findViewById(R.id.resultsList); 
    lv.setAdapter(new ArrayAdapter<String>(this, R.layout.resultitem, (String[])labelList.toArray(new String[labelList.size()]))); 

    lv.setOnItemClickListener(new OnItemClickListener() {  

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
      TextView tv = (TextView)view.findViewById(R.id.result); 
      tv.setBackgroundColor(Color.LTGRAY); 
      tv.setTextColor(Color.BLACK); 
     } 
    } 

Répondre

1

Vous devez passer outre getView() dans une sous-classe de ListAdapter, dans ce cas, ArrayAdapter. En effet, Android réutilise les lignes pour conserver les ressources et le processeur (lorsqu'une ligne défile sur l'écran, elle est réutilisée pour les nouvelles lignes qui apparaissent). Donc, si vous définissez le fond gris sur une ligne, il va probablement finir par être utilisé à nouveau, et l'arrière-plan sera toujours gris. Si vous sous-classez ArrayAdapter, votre onItemClickListener peut définir un type d'indicateur, puis getView() de votre ArrayAdapter, vous pouvez définir la couleur d'arrière-plan appropriée en fonction de l'indicateur.

This link a un exemple de sous-classement ArrayAdapter

+0

Merci pour votre aide! – searchMaker

+0

Y at-il un problème ici? private class LabelAdapter extends ArrayAdapter { \t private Chaîne [] articles; Public LabelAdapter (contexte de contexte, int textViewResourceId, chaîne [] chaînes) { \t \t this.items = chaînes; \t} \t \t @Override \t publique Voir getView (int position, Vue convertView, parent ViewGroup) { \t Voir v = convertView; \t TextView tt = (TextView) v.findViewById (R.id.résult); \t tt.setText (éléments [position]); \t return v; \t} \t} – searchMaker

+0

Il n'y a donc pas de moyen simple d'empêcher l'adaptateur de réutiliser les vues? – searchMaker

0

Je suppose que vous utilisez la conversion vue comme ce

...public View getView(int position, View convertView, ViewGroup parent) { .... 

et vous êtes en train de changer l'arrière-plan à la 4e place, et votre point de vue let dit avoir 6 lignes sur une page, toutes les 4 lignes de chaque page seront grisées en raison de la réutilisation du même fichier convertView. Je ne sais pas si j'explique correctement, mais si vous utilisez convertview et modifiez sa disposition, vous devriez avoir la logique de recréer cette disposition pour éviter de réutiliser la même vue (mise en cache).