Na interface do usuário, deve haver um botão giratório que contém alguns nomes (os nomes são visíveis) e cada nome tem seu próprio ID (os IDs não são iguais à seqüência de exibição). Quando o usuário seleciona o nome da lista, a variável currentID deve ser alterada.
O aplicativo contém o ArrayList
Onde User é um objeto com ID e nome:
public class User{
public int ID;
public String name;
}
O que eu não sei é como criar um spinner que exibe a lista de nomes de usuários e vincular itens do spinner a IDs. Assim, quando o item do spinner é selecionado / alterado, a variável currentID é definida como o valor apropriado.
Eu gostaria que alguém pudesse mostrar a solução do problema descrito ou fornecer algum link útil para resolvê-lo.
Obrigado!
Respostas:
Você pode olhar para esta resposta . Você também pode usar um adaptador personalizado, mas a solução abaixo é adequada para casos simples.
Aqui está uma nova publicação:
Então, se você veio aqui porque deseja ter rótulos e valores no Spinner - veja como eu fiz isso:
Spinner
maneira usualarray.xml
arquivo - uma matriz para rótulos, uma matriz para valoresSpinner
comandroid:entries="@array/labels"
Quando você precisar de um valor, faça algo assim (não, você não precisa encadeá-lo):
fonte
Eu sei que o tópico é antigo, mas por via das dúvidas ...
Objeto de usuário:
Adaptador giratório personalizado (ArrayAdapter)
E a implementação:
fonte
Skipped 317 frames! The application may be doing too much work on its main thread.
Alguma idéia?Solução mais simples
Depois de vasculhar diferentes soluções no SO, achei a seguinte a solução mais simples e limpa para preencher uma
Spinner
com customizaçãoObjects
. Aqui está a implementação completa:User.java
res / layout / spinner.xml
res / layout / your_activity_view.xml
Na sua atividade
fonte
currentID
assim que o valor do Spinner é alterado. Na maioria das vezes, você só precisa do valor do Spinner depois de pressionar um botão, como Enviar ou Salvar , não imediatamente após a mudança do Spinner e, se puder ser evitado, isso fornece uma solução muito mais simples.getSelectedItem()
chamada. Obrigado pela dica.Para soluções simples, você pode simplesmente sobrescrever o "toString" no seu objeto
e então você pode usar:
Dessa forma, seu girador mostrará apenas os nomes de usuário.
fonte
De longe, a maneira mais simples que eu encontrei:
Agora você pode colar qualquer objeto no seu girador e ele exibirá o rótulo especificado.
fonte
Apenas uma pequena alteração na resposta de Joaquin Alberto pode resolver o problema de estilo. Apenas substitua a função getDropDownView no adaptador personalizado, como abaixo,
fonte
Funciona bem para mim, o código necessário em torno da coisa getResource () é o seguinte:
Só precisa garantir (por si mesmo) que os valores nas duas matrizes estejam alinhados corretamente!
fonte
inspirado por Joaquin Alberto, isso funcionou para mim:
fonte
Baseado no exemplo de Joaquin Alberto (obrigado), mas funciona para qualquer tipo (você deve implementar toString () no tipo, para poder formatar a saída.
Também acho que você pode substituir a lista por matriz para que você não precisa fazer toArray na lista, mas eu tinha uma lista ..... :)
fonte
Para entender o truque, é preciso saber como os Adaptadores funcionam em geral e o ArrayAdapter em particular.
Adaptadores: são objetos capazes de vincular estruturas de dados a widgets, então esses widgets estão exibindo esses dados em uma Lista ou em um Spinner.
Portanto, as duas perguntas que um adaptador responde são:
EditText
por exemplo, do widget ou exibição composta de acordo com esses dados?As respostas do ArrayAdapter são:
row.xml
ORandroid.R.layout.simple_spinner_item
) para qualquer índice é o mesmo e é inflado a partir do recurso cujo ID foi fornecido ao construtor de ArrayAdapter..setText()
método do widget será usado com o formato de sequência do item na estrutura de dados de suporte. O formato da string será obtido invocando.toString()
o item.CustomListViewDemo.java
adaptor_content.xml
main.xml
Funciona corretamente, espero que seja útil.
fonte
Meu objeto personalizado é
Eu também queria definir esse objeto como minha fonte de adaptador para o meu spinner sem estender o ArrayAdapter para que o que eu fiz fosse.
Agora você poderá ver os resultados no seu spinner, o truque foi substituir
toString()
o objeto personalizado , portanto, o valor que você deseja exibir no spinner apenas retorna esse método.fonte
Eu acho que a melhor solução é a "Solução mais simples", de Josh Pinter .
Isso funcionou para mim:
fonte
Se você não precisa de uma classe separada, quero dizer apenas um simples adaptador mapeado em seu objeto. Aqui está o meu código com base nas funções ArrayAdapter fornecidas.
E porque você pode precisar adicionar item após a criação do adaptador (por exemplo, carregamento assíncrono do item do banco de dados).
Simples, mas eficiente.
E então você pode usar esse código (não pude colocar Category [] no construtor do adaptador, porque os dados são carregados separadamente).
Observe que adapter.addAll (itens) atualiza o girador chamando notifyDataSetChanged () em internal.
fonte
Faz:
fonte