Android: désactivation de la surbrillance sur la listeVoir le clic

302

Je souhaite désactiver la surbrillance orange qui se produit lorsque vous touchez une ligne listView. Jusqu'à présent, dans mon xml, j'ai essayé ce qui suit:

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

Plus d'informations: Je veux qu'il n'y ait aucune différence lorsqu'un utilisateur touche l'écran sur cet objet listView.

John Moffitt
la source

Réponses:

674

Ajoutez ceci à votre xml:

android:listSelector="@android:color/transparent"

Et pour le problème, cela peut fonctionner (je ne suis pas sûr et je ne sais pas s'il existe de meilleures solutions):

Vous pouvez appliquer un ColorStateList à votre TextView.

RoflcoptrException
la source
2
si transparent assombrit encore un peu la sélection, il n'est peut-être pas défini comme complètement transparent. Essayez plutôt # 00000000, c'est totalement invisible.
Ridcully
Solution parfaite pour moi. J'ai essayé de définir un sélecteur XML transparent pouvant être dessiné pour l'arrière-plan de la liste des vues entourant la mise en page, mais cela a conduit à la barre orange susmentionnée sur les appareils ICS.
Markus Rudel
@RoflcoptrException J'utilise un Fragmentpour la liste. La disposition XML contient un LinearLayoutet plusieurs TextViewéléments. Où dois-je désactiver la surbrillance de ligne, s'il vous plaît?
JJD
40
Depuis Java Code, vous pouvez le fairelistView.setSelector(android.R.color.transparent);
sulai
@RoflcoptrException -> "Vous pouvez appliquer un ColorStateList à votre TextView" - c'est une bonne option, si les lignes de la liste ne sont pas cliquables. Dès que la vue textuelle est cliquable, l'événement onClick de la liste elle-même ne se déclenche pas.
Sebastian Hojas
189

La réponse de RoflcoptrException devrait faire l'affaire, mais pour une raison quelconque, cela n'a pas fonctionné pour moi, donc je poste la solution qui a fonctionné pour moi, j'espère qu'elle aide quelqu'un

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>
Mushtaq Jameel
la source
101

L'effet de surbrillance orange est un style sur le ListView. Cet article donne un bon aperçu de la façon de remplacer le style listView.

Essentiellement, vous disposez d'un sélecteur qui spécifie différents éléments de style en fonction de l'état actuel.

voir ceci pour une solution courte et rapide https://stackoverflow.com/a/12242564/185022

Cheryl Simon
la source
Cette méthode me permettra-t-elle d'avoir un style différent pour chaque objet listView? Est-il également possible d'éviter le problème que j'ai soulevé dans la réponse de Sebi?
John Moffitt
1
Oui, vous pouvez remplacer tous les attributs de style. Vous pouvez spécifiquement attribuer un style à chaque ListView en utilisant l'attribut style = "@ style / MyStyle" comme décrit dans le premier lien.
Cheryl Simon
Je suis désolé mais cela ne devrait pas être la réponse. Changer le listSelectordevrait être ça.
Ayman Salah
63

Depuis ListView: désactivez la mise en surbrillance de la mise au point ,

lorsque vous définissez votre ListAdapterutilisation du code suivant

ListAdapter adapter = new SimpleCursorAdapter(MyList, Layout, c, 
                new String[] { "Name", "Score" }, to) 
{ 
    public boolean areAllItemsEnabled() 
    { 
        return false; 
    } 
    public boolean isEnabled(int position) 
    { 
        return false; 
    } 
}; 

Cela remplacera la BaseAdapterclasse. Il annule également la bordure blanche entre les cellules.

emdog4
la source
4
Invalide, le comportement de sélection est désactivé (OnItemClicked ne se déclenche pas) pour l'élément
Sandor
6
C'est une bonne solution, car le fait qu'un élément de liste soit mis en surbrillance soit davantage un problème de comportement qu'un problème esthétique. Ainsi, vous pouvez l'utiliser pour les vues de liste que vous ne souhaitez pas avoir la propriété d'être sélectionnable. Un style global n'a pas vraiment de sens, car vous savez que vous allez éventuellement vouloir une liste qui peut être sélectionnée, et l'utilisation de styles pour le comportement me semble incorrecte. Ils ne devraient pas avoir de signification sémantique, seulement esthétique. La propriété de la sélection est une chose sémantique.
Thomas Dignan
En dehors de cela, ce n'est pas la réponse à cette question, remplacer la isEnableddésactivation d'un élément n'est pas le moyen de le désactiver! La documentation indique que cela isEnabledest censé déterminer si un élément est un séparateur.
Bakhshi
39

ajoutez cela aussi à ur XMl avec listselector..hope ça marchera

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 
Sheetal
la source
2
Merci beaucoup. Je veux résoudre le problème que toute la listView est mise en évidence (couleur blanche dans mon cas) lors du défilement (ne se produit qu'avant Android 2.3). Et il fonctionne.
Yeung
"# 00000000" et "@android: couleur / transparent" pour le type de variété?
Androider
@Androider ya en 2011 Je faisais savoir aux gens que cela fonctionne dans les deux sens ... Certainement aujourd'hui, vous n'aurez pas besoin de # 000000
Sheetal
32

Si vous utilisez ArrayAdapterou BaseAdapterpour remplir les éléments de la liste. Overridela isEnabledméthode et le retour false.

 @Override
  public boolean isEnabled (int position) {
    return false;
  }
Libin
la source
13

Après quelques `` google '' et tests sur des appareils virtuels et réels, je remarque que mon code ci-dessous fonctionne:

ArrayAdapter<String> myList = new ArrayAdapter<String>(this, R.layout.list_item, strText) {
    public boolean isEnabled(int position) 
    { 
            return false; 
    } 
};

remarquez que j'ai omis la areAllItemsEnabled()partie.

aérobrain
la source
cela a fonctionné pour moi. cependant, cela ne signifie-t-il pas que s'il y a un dessin pour les lignes qui a l'état désactivé, cela changera également leur image? est-il possible de désactiver le clic sans pour autant changer le dessinable?
développeur Android
1
Cela a un effet secondaire qui empêche ListView d'afficher les séparateurs.
Maciej Pigulski
11

Rien ne m'aide mais ceci:

transparent_drawable.xml:

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

layout.xml:

android:listSelector="@drawable/transparent_drawable"
Dmitry Chistyakov
la source
7

dans du code

listView.setSelector(getResources().getDrawable(R.drawable.transparent));

et ajoutez une petite image transparente au dossier dessinable.

Comme: transparent.xml

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>
Robert Bae Dong Hwan
la source
5

Pour moi, android:focusableInTouchMode="true"c'est la voie à suivre. android:listSelector="@android:color/transparent" ne sert à rien. Notez que j'utilise une liste personnalisée avec un certain nombre d'objets dans chaque ligne.

erdomester
la source
5

Il vous suffit d'ajouter: android:cacheColorHint="@android:color/transparent"

Prakash
la source
5

Comme alternative:

listView.setSelector(android.R.color.transparent);

ou

listView.setSelector(new StateListDrawable());
Natali
la source
1

Il existe un moyen rapide et facile de le faire: Dans la méthode:

private void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    //TODO
    ((ListView)sender).SelectedItem = null;
}

J'espère que ça vous aidera;)

FeldonDragon
la source
Ce c # n'est pas java
Anthony
Je pense que la plupart des programmeurs Android utilisent toujours Java car c'est ce que prend en charge Android Studio, mais C # peut être utilisé. Je veux juste clarifier que c'est C #: D
Anthony
0

Si vous souhaitez désactiver la surbrillance pour un seul élément d'affichage de liste, mais que la cellule reste activée, définissez la couleur d'arrière-plan de cette cellule pour désactiver la surbrillance.

Par exemple, dans la disposition de votre cellule, définissez android:background="@color/white"

Joie
la source
0

vous pouvez simplement obtenir ce posque vous obtenez du onItemClick et faites:

listView.setItemChecked(pos, false);

c'est la meilleure façon que je connaisse

Chef Madog
la source