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.

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.


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

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


¿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.


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

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

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.


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"

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>

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.


5

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


5

Como alternativa:

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

o

listView.setSelector(new StateListDrawable());

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


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"


0

puedes obtener lo posque obtienes de onItemClick y hacer:

listView.setItemChecked(pos, false);

esa es la mejor manera que conozco

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.