É possível aplicar um plano de fundo personalizado a cada item do Listview por meio do seletor de lista?
O seletor padrão especifica @android:color/transparent
para o state_focused="false"
caso, mas alterar isso para algum drawable personalizado não afeta os itens que não são selecionados. Romain Guy parece sugerir nesta resposta que isso é possível.
No momento, estou conseguindo o mesmo efeito usando um plano de fundo personalizado em cada visualização e ocultando-o quando o item é selecionado / focado / seja o que for para que o seletor seja mostrado, mas seria mais elegante ter tudo isso definido em um só lugar.
Para referência, este é o seletor que estou usando para tentar fazer isso funcionar:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false"
android:drawable="@drawable/list_item_gradient" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="true"
android:drawable="@drawable/list_selector_background_focus" />
</selector>
E é assim que estou configurando o seletor:
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@drawable/list_selector_background" />
Agradecemos antecipadamente por qualquer ajuda!
A solução dglmtn não funciona quando você tem um drawable de 9 remendos com preenchimento como plano de fundo. Coisas estranhas acontecem, eu não quero nem falar sobre isso, se você tem esse problema, você conhece.
Agora, se você quiser ter um listview com diferentes estados e drawables de 9 patch (ele funcionaria com qualquer drawables e cores, eu acho), você deve fazer 2 coisas:
O que você deve fazer é primeiro definir o row_selector.xml:
Não se esqueça do
android:state_selected
. Funciona comoandroid:state_focused
para a lista, mas é aplicado para o item da lista.Agora aplique o seletor aos itens (row.xml):
Faça um seletor transparente para a lista:
Isso deve fazer a coisa.
fonte
Nunca, jamais use uma "cor de fundo" para suas linhas de listview ...
isso irá bloquear todas as ações do seletor (foi o meu problema!)
boa sorte!
fonte
setBackgroundColor
com uma "cor". Sigh ... UsesetBackground
ou desetBackgroundDrawable
acordo com sua versão API com um seletor.O artigo "Por que minha lista está preta? Uma otimização do Android" no Android Developers Blog tem uma explicação completa de por que o plano de fundo da lista fica preto ao rolar. Resposta simples: defina cacheColorHint em sua lista como transparente (# 00000000).
fonte
É o suficiente, se você colocar
list_row_layout.xml
:listitem_selector.xml:
fonte
ao invés de:
escrever
fonte
Você pode escrever um tema:
theme.xml
styles.xml
my_selector é seu seletor personalizado. Lamento, mas não sei escrever meu código
fonte
Não tenho certeza de como alcançar o efeito desejado por meio do próprio seletor - afinal, por definição, há um seletor para toda a lista.
No entanto, você pode obter controle sobre as alterações de seleção e desenhar o que quiser. No presente projeto de exemplo , eu faço o seletor transparente e desenhar um bar no item selecionado.
fonte
<item android:state_focused="false" android:drawable="@android:color/transparent" />
cláusula no seletor padrão.Eu sempre uso o mesmo método e funciona sempre, em qualquer lugar: eu simplesmente uso um seletor como este
e definir no ListView (ISTO É MUITO IMPORTANTE PARA FAZER FUNCIONAMENTO) o atributo
para textColor basta colocar na pasta de cores (IMPORTANTE, não na pasta drawable!) um seletor como este
este é um modelo de linha de amostra
tudo mostrou funcionar sem soluções alternativas tediosas. espero que esta ajuda
fonte
Equipe FrostWire aqui.
Todo o seletor crap api não funciona como esperado. Depois de tentar todas as soluções apresentadas neste tópico sem sucesso, apenas resolvemos o problema no momento de inflar o Item ListView.
Certifique-se de que seu item mantenha seu estado, fizemos isso como uma variável membro do MenuItem (booleano selecionado)
Ao inflar, pergunte se o item subjacente está selecionado, em caso afirmativo, apenas defina o recurso drawable que deseja como plano de fundo (seja um 9 patch ou qualquer outro). Certifique-se de que seu adaptador esteja ciente disso e que chame notificarDataChanged () quando algo for selecionado.
Seria muito bom se os seletores funcionassem, em teoria é uma solução bonita e elegante, mas parece que está quebrado. BEIJO.
fonte