Android: desativando o destaque na lista

302

Desejo desativar o destaque laranja que ocorre ao tocar em uma linha listView. Até agora, no meu xml, tentei o seguinte:

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

Mais informações: Desejo que não haja diferença zero quando um usuário tocar na tela neste objeto listView.

John Moffitt
fonte

Respostas:

674

Adicione isso ao seu xml:

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

E para o problema, isso pode funcionar (não tenho certeza e não sei se existem soluções melhores):

Você pode aplicar um ColorStateList ao seu TextView.

RoflcoptrException
fonte
2
se transparente ainda escurece um pouco a seleção, talvez não seja definido como completamente transparente. Experimente # 00000000, isso é totalmente invisível.
Ridcully 01/04
Solução perfeita para mim. Tentei definir um selecionável XML selecionável para o segundo plano das visualizações de lista em torno do layout, mas isso levou à barra laranja acima mencionada nos dispositivos ICS.
Markus Rudel
@RoflcoptrException Eu uso um Fragmentpara a lista. O layout XML contém um LinearLayoute vários TextViewitens. Onde devo desativar o destaque da linha, por favor?
JJD
40
Do código Java, você pode fazerlistView.setSelector(android.R.color.transparent);
sulai
@RoflcoptrException -> "Você pode aplicar um ColorStateList ao seu TextView" - essa é uma boa opção, se as linhas da lista não forem clicáveis. Assim que a visualização de texto for clicável, o evento onClick da lista em si não será acionado.
23612 Sebastian Hojas
189

A resposta de RoflcoptrException deve funcionar, mas, por algum motivo, não funcionou para mim. Portanto, estou postando a solução que funcionou para mim, espero que ajude alguém.

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

O efeito de destaque laranja é um estilo no ListView. Este artigo fornece uma boa visão geral de como substituir o estilo listView.

Essencialmente, você tem um seletor que especifica diferentes elementos de estilo com base no estado atual.

veja isso para uma solução curta e rápida https://stackoverflow.com/a/12242564/185022

Cheryl Simon
fonte
Esse método permitirá que eu tenha um estilo diferente para cada objeto listView? Além disso, é possível evitar o problema que levantei na resposta de Sebi?
John Moffitt 25/05
1
Sim, você pode substituir qualquer atributo de estilo. Você pode atribuir um estilo especificamente a cada ListView usando o atributo style = "@ style / MyStyle", conforme descrito no primeiro link.
Cheryl Simon
Sinto muito, mas essa não deve ser a resposta. Mudando o que listSelectordeveria ser.
Ayman Salah
63

No ListView: desative o destaque de foco ,

quando você define seu ListAdapteruso, o código a seguir

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

Isso substituirá a BaseAdapterclasse. Também cancela a borda branca entre as células.

emdog4
fonte
4
Inválida, que é desactivado o comportamento de seleção (OnItemClicked não dispara) para o item
Sandor
6
Essa é uma boa solução, pois se um item de exibição de lista é destacado é mais um problema comportamental do que estético. Portanto, você pode usar isso para as listviews que você não deseja ter a propriedade de ser selecionável. Um estilo global não faz muito sentido, pois você sabe que, eventualmente, deseja uma exibição de lista que pode ser selecionada, e o uso de estilos como comportamento para mim parece errado. Eles não devem ter significado semântico, apenas estético. A propriedade da selecionabilidade é uma coisa semântica.
Thomas Dignan
Além disso, essa não é a resposta para esta pergunta, substituir isEnabledum item não é a maneira de desativá-lo! A documentação diz que isEnabledé suposto determinar se um item é um separador.
Bakhshi
39

adicione isso também ao seu XMl junto com o listselector .. espero que funcione

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 
sheetal
fonte
2
Muito Obrigado. Quero resolver o problema de todo o listView ficar em destaque (cor branca no meu caso) ao rolar (só acontece antes do Android 2.3). E funciona.
Yeung
"# 00000000" e "@android: color / transparent" para o tipo de variedade?
Androider
@Androider ya em 2011 eu estava deixando as pessoas saibam que funciona nos dois sentidos ... Definitivamente, hoje você não vai precisar # 000000
sheetal
32

Se você estiver usando ArrayAdapterou BaseAdapterpara preencher os itens da lista. Overrideo isEnabledmétodo e retorno false.

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

Depois de alguns 'google'ing e testes em dispositivos virtuais e reais, percebo que meu código abaixo funciona:

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

observe que eu omiti a areAllItemsEnabled()parte.

aerobrain
fonte
isso funcionou para mim. no entanto, isso não significa que, se houver um desenho para as linhas que tem o estado desativado, isso também mudará sua imagem? é possível desativar o clique e ainda não alterar o drawable?
desenvolvedor android
1
Isso tem um efeito colateral, fazendo com que o ListView não mostre divisores.
Maciej Pigulski
11

Nada me ajuda, mas isso:

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

em código

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

e adicione pequena imagem transparente à pasta drawable.

Como: 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
fonte
5

Para mim android:focusableInTouchMode="true"é o caminho a percorrer. android:listSelector="@android:color/transparent" é inútil. Observe que estou usando uma exibição de lista personalizada com vários objetos em cada linha.

erdomester
fonte
5

Você só precisa adicionar: android:cacheColorHint="@android:color/transparent"

Prakash
fonte
5

Como uma alternativa:

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

ou

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

Existe uma maneira rápida e fácil de fazer isso: No método:

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

Espero que ajude;)

FeldonDragon
fonte
Este c # não java
Anthony
Acho que a maioria dos programadores do Android ainda está usando java, porque é isso que o Android Studio suporta, mas o C # pode ser usado. Eu só quero esclarecer que este é C #: D
Anthony
0

Se você deseja desativar o realce para um único item de exibição de lista, mas mantenha a célula ativada, defina a cor de plano de fundo para essa célula para desativar o realce.

Por exemplo, no layout da sua célula, defina android:background="@color/white"

Alegria
fonte
0

você pode obter o posque obtém do onItemClick e fazer:

listView.setItemChecked(pos, false);

essa é a melhor maneira que eu conheço

Chefe Madog
fonte