Android: disabilitazione dell'evidenziazione su listView click


302

Voglio disabilitare l'evidenziazione arancione che si verifica quando si tocca una riga listView. Finora nel mio XML ho provato quanto segue:

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

Ulteriori informazioni: Voglio che ci sia differenza zero quando un utente tocca lo schermo su questo oggetto listView.

Risposte:


674

Aggiungi questo al tuo XML:

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

E per il problema potrebbe funzionare (non sono sicuro e non so se ci sono soluzioni migliori):

È possibile applicare una ColorStateList a TextView.


2
se il trasparente oscura ancora un po 'la selezione, forse non è definito come completamente trasparente. Prova invece # 00000000, questo è totalmente invisibile.
Ridcully

Soluzione perfetta per me Ho provato a impostare un selettore XML trasparente selezionabile per lo sfondo delle visualizzazioni di elenco che circondano il layout, ma questo ha portato alla barra arancione sopra menzionata sui dispositivi ICS.
Markus Rudel,

@RoflcoptrException Io uso un Fragmentper l'elenco. Il layout XML contiene un LinearLayoute più TextViewelementi. Dove devo disabilitare l'evidenziazione di riga, per favore?
JJD

40
Dal codice Java, puoi farelistView.setSelector(android.R.color.transparent);
sulai l'

@RoflcoptrException -> "È possibile applicare una ColorStateList a TextView": questa è una buona opzione se le righe dell'elenco non sono selezionabili. Non appena è possibile fare clic sulla visualizzazione di testo, l'evento onClick dell'elenco stesso non verrà attivato.
Sebastian Hojas,

189

La risposta di RoflcoptrException dovrebbe fare il trucco, ma per qualche ragione non ha funzionato per me, quindi sto pubblicando la soluzione che ha funzionato per me, spero che aiuti qualcuno

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>

101

L'effetto di evidenziazione arancione è uno stile su ListView. Questo articolo offre una buona panoramica di come sovrascrivere lo stile listView.

In sostanza, hai un selettore che specifica diversi elementi di stile in base allo stato corrente.

vedere questo per una soluzione breve e rapida https://stackoverflow.com/a/12242564/185022


Questo metodo mi permetterà di avere uno stile diverso per ogni oggetto listView? Inoltre, è possibile evitare il problema sollevato nella risposta di Sebi?
John Moffitt,

1
Sì, puoi sovrascrivere qualsiasi attributo di stile. È possibile assegnare specificamente uno stile a ciascun ListView utilizzando l'attributo style = "@ style / MyStyle" come descritto nel primo collegamento.
Cheryl Simon,

Mi dispiace ma questa non dovrebbe essere la risposta. Cambiare listSelectordovrebbe essere.
Ayman Salah,

63

Da ListView: disabilita l'evidenziazione della messa a fuoco ,

quando imposti il ​​tuo ListAdapteruso il seguente codice

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

Questo sostituirà la BaseAdapterclasse. Annulla anche il bordo bianco tra le cellule.


4
Non valido, che ha disabilitato il comportamento di selezione (OnItemClicked non si attiva) per l'articolo
Sandor,

6
Questa è una buona soluzione perché l'evidenziazione di un elemento listview è più un problema comportamentale che estetico. Quindi, puoi usarlo per le visualizzazioni di elenco che non desideri avere la proprietà di essere selezionabili. Uno stile globale non ha davvero senso, dal momento che sai che alla fine vorrai una lista che possa essere selezionata, e usare gli stili per il comportamento per me sembra sbagliato. Non dovrebbero avere un significato semantico, solo estetico. La proprietà della selezionabilità è una cosa semantica.
Thomas Dignan,

A parte questo, questa non è la risposta a questa domanda, l'override isEnabledper disabilitare un elemento non è il modo per disabilitarlo! La documentazione dice che isEnableddovrebbe determinare se un articolo è un separatore.
Bakhshi,

39

aggiungilo anche al tuo XMl insieme a listselector..hope funzionerà

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 

2
Grazie molto. Voglio risolvere il problema che l'intero elenco è evidenziato (nel mio caso il colore bianco) durante lo scorrimento (Succede solo prima di Android 2.3). E funziona.
Yeung,

"# 00000000" e "@android: color / transparent" per tipo di varietà?
Androider,

@Androider ya nel 2011 stavo facendo sapere alla gente che funziona in entrambi i modi ... Sicuramente oggi non avrai bisogno di # 000000
foglio

32

Se si sta utilizzando ArrayAdaptero BaseAdapterper popolare gli elementi dell'elenco. Overrideil isEnabledmetodo e ritorno false.

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

13

Dopo alcuni "google" e test su dispositivi virtuali e reali, noto che il mio codice qui sotto funziona:

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

notare che ho omesso la areAllItemsEnabled()parte.


questo ha funzionato per me. tuttavia, non significa che se esiste un disegno per le righe con lo stato disabilitato, cambierà anche la loro immagine? è possibile disabilitare il clic e non modificare il disegno?
sviluppatore Android il

1
Ciò ha un effetto collaterale che impedisce a ListView di mostrare i divisori.
Maciej Pigulski,

11

Niente mi aiuta ma questo:

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

nel codice

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

e aggiungi una piccola immagine trasparente alla cartella disegnabile.

Mi piace: 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

Per me android:focusableInTouchMode="true"è la strada da percorrere. android:listSelector="@android:color/transparent" non serve a niente. Si noti che sto usando una visualizzazione elenco personalizzata con un numero di oggetti in ogni riga.


5

Devi solo aggiungere: android:cacheColorHint="@android:color/transparent"


5

Come alternativa:

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

o

listView.setSelector(new StateListDrawable());

1

C'è un modo semplice e veloce per farlo: Nel metodo:

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

Spero che ti sia d'aiuto;)


Questo non è java
Anthony,

Penso che la maggior parte dei programmatori Android stiano ancora usando Java perché questo è ciò che supporta Android Studio, ma C # può essere usato. Voglio solo chiarire che questo è C #: D
Anthony

0

Se si desidera disabilitare l'evidenziazione per un singolo elemento della visualizzazione elenco, ma mantenere abilitata la cella, impostare il colore di sfondo per quella cella per disabilitare l'evidenziazione.

Ad esempio, nel layout della cella, impostare android:background="@color/white"


0

puoi semplicemente ottenere posciò che ottieni da onItemClick e fare:

listView.setItemChecked(pos, false);

è il modo migliore che conosco

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.