Android: deshabilitar resaltado en la lista Ver clic

302

Quiero deshabilitar el resaltado naranja que ocurre al tocar una fila listView. Hasta ahora en mi xml he intentado lo siguiente:

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

Más información: Quiero que haya una diferencia cero cuando un usuario toca la pantalla en este objeto listView.

John Moffitt
fuente

Respuestas:

674

Agregue esto a su xml:

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

Y para el problema esto puede funcionar (no estoy seguro y no sé si hay mejores soluciones):

Puede aplicar una ColorStateList a su TextView.

RoflcoptrException
fuente
2
si transparente todavía oscurece un poco la selección, tal vez no se define como completamente transparente. Pruebe # 00000000 en su lugar, esto es totalmente invisible.
Ridcully
La solución perfecta para mi. Intenté establecer un selector transparente XML dibujable para el fondo de las vistas de lista que rodean el diseño, pero esto condujo a la mencionada barra naranja en dispositivos ICS.
Markus Rudel
@RoflcoptrException Utilizo a Fragmentpara la lista. El diseño XML contiene uno LinearLayouty varios TextViewelementos. ¿Dónde debo deshabilitar el resaltado de fila, por favor?
JJD
40
Desde Java Code, puedes hacerlolistView.setSelector(android.R.color.transparent);
sulai el
@RoflcoptrException -> "Podría aplicar una ColorStateList a su TextView" - esta es una buena opción, si no se puede hacer clic en las filas de la lista. Tan pronto como se pueda hacer clic en la vista de texto, el evento onClick de la lista en sí no se activará.
Sebastian Hojas
189

La respuesta de RoflcoptrException debería hacer el truco, pero por alguna razón no funcionó para mí, así que estoy publicando la solución que funcionó para mí, espero que ayude a alguien

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

El efecto de resaltado naranja es un estilo en ListView. Este artículo ofrece una buena descripción general de cómo anular el estilo listView.

Básicamente, tiene un selector que especifica diferentes elementos de estilo en función del estado actual.

vea esto para obtener una solución breve y rápida https://stackoverflow.com/a/12242564/185022

Cheryl Simon
fuente
¿Me permitirá este método tener un estilo diferente para cada objeto listView? Además, ¿es posible evitar el problema que mencioné en la respuesta de Sebi?
John Moffitt
1
Sí, puede anular cualquier atributo de estilo. Puede asignar específicamente un estilo a cada ListView usando el atributo style = "@ style / MyStyle" como se describe en el primer enlace.
Cheryl Simon
Lo siento, pero esta no debería ser la respuesta. Cambiar el listSelectordebería ser.
Ayman Salah
63

Desde ListView: Deshabilite Focus Highlight ,

cuando configuras tu ListAdapteruso, el siguiente código

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

Esto anulará la BaseAdapterclase. También cancela el borde blanco entre las células.

emdog4
fuente
44
Inválido, eso deshabilitó el comportamiento de selección (OnItemClicked no se disparará) para el artículo
Sandor
66
Esta es una buena solución porque si un elemento de vista de lista está resaltado es más un problema de comportamiento que estético. Por lo tanto, puede usar esto para las vistas de lista que no desea tener la propiedad de ser seleccionable. Un estilo global realmente no tiene sentido, ya que sabes que eventualmente querrás una vista de lista que se pueda seleccionar, y usar estilos para el comportamiento me parece incorrecto. No deberían tener un significado semántico, solo estético. La propiedad de la posibilidad de selección es una cosa semántica.
Thomas Dignan
Además de que esta no es la respuesta a esta pregunta, anular isEnabledpara deshabilitar un elemento no es la forma de deshabilitarlo. La documentación dice que isEnabledse supone que determina si un elemento es un separador.
Bakhshi
39

agregue esto también a su XMl junto con listselector ... espero que funcione

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 
sheetal
fuente
2
Muchas gracias. Quiero resolver el problema de que todo el listView está resaltado (color blanco en mi caso) al desplazarse (solo sucede antes de Android 2.3). Y funciona.
Yeung
"# 00000000" y "@android: color / transparent" para el tipo de variedad?
Androider
@Androider ya en 2011, le estaba haciendo saber a la gente que funciona en ambos sentidos ... Definitivamente hoy no necesitarás # 000000
sheetal
32

Si está utilizando ArrayAdaptero BaseAdapterpara completar los elementos de la lista. OverrideEl isEnabledmétodo y el retorno false.

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

Después de algunos 'google' y pruebas en dispositivos virtuales y reales, noto que mi código a continuación funciona:

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

Observe que he omitido la areAllItemsEnabled()porción.

aerobrain
fuente
Esto funcionó para mí. sin embargo, ¿no significa que si hay un dibujo para las filas que tiene el estado deshabilitado, también cambiará su imagen? ¿Es posible deshabilitar el clic y aún así no cambiar el dibujo?
Desarrollador de Android
1
Esto tiene un efecto secundario que hace que ListView no muestre divisores.
Maciej Pigulski
11

Nada me ayuda más que esto:

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
fuente
7

en codigo

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

y agregue una pequeña imagen transparente a la carpeta dibujable.

Me gusta: 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
fuente
5

Para mí android:focusableInTouchMode="true"es el camino a seguir. android:listSelector="@android:color/transparent" No sirve de nada. Tenga en cuenta que estoy usando una vista de lista personalizada con varios objetos en cada fila.

erdomester
fuente
5

Solo necesitas agregar: android:cacheColorHint="@android:color/transparent"

Prakash
fuente
5

Como alternativa:

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

o

listView.setSelector(new StateListDrawable());
Natali
fuente
1

Hay una manera rápida y fácil de hacer esto: En método:

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

Espero que ayude;)

FeldonDragon
fuente
This c # not java
Anthony
Creo que la mayoría de los programadores de Android todavía usan Java porque eso es lo que Android Studio admite, pero C # puede ser utilizado. Solo quiero aclarar que esto es C #: D
Anthony
0

Si desea deshabilitar el resaltado para un solo elemento de vista de lista, pero mantener la celda habilitada, configure el color de fondo para esa celda para deshabilitar el resaltado.

Por ejemplo, en el diseño de su celda, establezca android:background="@color/white"

Alegría
fuente
0

puedes obtener lo posque obtienes de onItemClick y hacer:

listView.setItemChecked(pos, false);

esa es la mejor manera que conozco

Jefe Madog
fuente