0

J'ai un ListView et je voulais changer la valeur par défaut en bleu clair quand il est réglé sur listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); à une image personnalisée non seulement lorsque l'élément est sélectionné/pressé, mais reste également sélectionné/pressé par ce code:Comment changer la surbrillance bleue de la sélection ListView avec l'image personnalisée (pas le sélecteur)?

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // TODO Auto-generated method stub 
    v.setBackgroundResource(0); 
    view.setBackgroundDrawable(getResources().getDrawable(
      R.drawable.list_item_highlight_short)); 
    v = view; 
} 

Le problème est que si j'ai 20 élément dans ma ListView, certains éléments qui ne sont pas dans la vue sont toujours mis en évidence et non inclus v.setBackgroundResource(0);

Comment puis-je supprimer la BackgroundResource de tous les éléments dans la ListView afin que je puisse définir l'élément cliqué sur un fond d'image personnalisée pour indiquer l'état «sélectionné»?

Répondre

0

Stockez la position de l'élément cliqué dans votre adaptateur. Comme dans la fonction ci-dessus adapter.setPosition (position). Puis, en fonction getView de l'adaptateur, vérifiez si la position est sélectionné une, puis changer backgroung en conséquence

+0

Qu'est-ce que 'adapter' dans' adapter.setPosition (position) '? Ma classe d'adaptateur étend ArrayAdapter mais n'a pas la méthode 'setPosition'. Pouvez-vous me montrer le code? –

+0

J'utilise l'adaptateur de base \t et j'y ajoute mes propres méthodes comme adaptateur de tableau pour les enfants. Vous pouvez facilement trouver des exemples pour it.technique nous pour enregistrer l'élément sélectionné dans l'adaptateur et dans getview changer la terre au besoin –

1

S'il vous plaît essayer d'utiliser le ListSelecter propriété de votre listview

par exemple:

<ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:listSelector="#0000ff" > 

    </ListView> 
+0

Au lieu du code de couleur, vous pouvez utiliser l'élément drawable comme android: listSelector = "R.drawable.list_item_highlight_short" –

+0

Ceci est fonctionne en partie mais quand je fais défiler rapidement le ListView avec environ 20 éléments, l'arrière-plan de l'image est en quelque sorte attaché à l'élément sélectionné et reste en haut de la liste lorsque je défile vers le haut ou vers le bas. Mais si l'élément sélectionné est dans la vue de ListView, l'image d'arrière-plan reviendra à la position de l'élément sélectionné. –

2

Essayez pour remplacer la méthode getView de votre adaptateur. Et faites ce travail dans cette méthode.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.Your_listview_layout, null); 
    } 

    if (listview.isItemChecked(position)) {       
     v.setBackgroundResource(R.drawable.list_item_highlight_short);          
    } else { 
     v.setBackgroundResource(0);      
    } 
    return super.getView(position, v, parent); 
} 
+0

Comment puis-je obtenir la référence 'listview' dans la ligne' if (listview.isItemChecked (position)) {'où' getView' se trouve dans ma classe ArrayAdapter personnalisée et ma ListView est dans mon Activity appelant. Et il y a aussi une erreur 'Arrayadapter requiert que l'ID de ressource soit un textview' dans la ligne' return super.getView (position, v, parent); 'puisque mon item_view n'a pas seulement TextView mais aussi d'autres éléments. –

+0

Modifiez votre 'ArrayAdapter' comme [this] (http://stackoverflow.com/questions/9280965/arrayadapter-requires-the-resource-id-to-be-a-textview-xml-problems/9282069#9282069) answer . Et essayez à nouveau. – Gunaseelan

Questions connexes