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.

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.


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"
/>

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


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.


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"/> 

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;
  }

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.


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"

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>

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.


5

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


5

Comme alternative:

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

ou

listView.setSelector(new StateListDrawable());

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;)


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"


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.