Eu tenho uma visualização de atualização, na qual preciso pré-selecionar o valor armazenado no banco de dados para um Spinner.
Eu estava pensando em algo assim, mas o método Adapter
não tem indexOf
, por isso estou preso.
void setSpinner(String value)
{
int pos = getSpinnerField().getAdapter().indexOf(value);
getSpinnerField().setSelection(pos);
}
Uma maneira simples de definir o girador com base no valor é
Caminho para código complexo já está lá, isso é muito mais simples.
fonte
break;
quando o índice for encontrado para acelerar o processo.0
, você deve retornar-1
se o valor não for encontrado - como mostrado na minha resposta: stackoverflow.com/a/32377917/1617737 :-)0
como cenário de backup. Se você definir-1
qual item seria visível no girador, suponho que o 0º elemento do adaptador giratório, a adição de -1 também adicione excesso de peso para verificar se o valor é -1 ou não, pois a configuração -1 causará exceção.Eu mantenho uma ArrayList separada de todos os itens em meus Spinners. Dessa forma, eu posso fazer indexOf no ArrayList e, em seguida, usar esse valor para definir a seleção no Spinner.
fonte
Com base na resposta da Merrill , eu vim com essa solução de linha única ... não é muito bonita, mas você pode culpar quem mantém o código
Spinner
por negligenciar a inclusão de uma função que faz isso para isso.Você receberá um aviso sobre como o elenco de um
ArrayAdapter<String>
é desmarcado ... realmente, você pode simplesmente usar umArrayAdapter
como Merrill, mas isso apenas troca um aviso por outro.fonte
se você estiver usando um array de strings, esta é a melhor maneira:
fonte
Você pode usar isso também,
fonte
Se você precisar ter um método indexOf em qualquer adaptador antigo (e não souber a implementação subjacente), poderá usar o seguinte:
fonte
Com base na resposta da Merrill, aqui está como fazer com um CursorAdapter
fonte
Use a seguinte linha para selecionar usando o valor:
fonte
Estou usando um adaptador personalizado, para que esse código seja suficiente:
Portanto, seu snippet de código será assim:
fonte
Este é o meu método simples de obter o índice por string.
fonte
Você pode usar dessa maneira, basta tornar seu código mais simples e mais claro.
Espero que ajude.
fonte
aqui está a minha solução
e getItemIndexById abaixo
Espero que esta ajuda!
fonte
Aqui está como fazer isso se você estiver usando um
SimpleCursorAdapter
(ondecolumnName
é o nome da coluna db que você usou para preencher o seuspinner
):Além disso (um refinamento da resposta de Akhil ), esta é a maneira correspondente de fazer isso se você estiver preenchendo seu Spinner a partir de uma matriz:
fonte
Se você definir uma matriz XML para o controle giratório no layout XML, poderá fazer isso
fonte
Na verdade, existe uma maneira de fazer isso usando uma pesquisa de índice no AdapterArray e tudo isso pode ser feito com reflexão. Eu mesmo fui um passo além, pois tinha 10 Spinners e queria defini-los dinamicamente no meu banco de dados, e o banco de dados mantém o valor apenas não o texto, pois o Spinner realmente muda semana a semana, então o valor é o meu número de identificação do banco de dados.
Aqui está a pesquisa indexada que você pode usar em praticamente qualquer lista, desde que os campos estejam no nível superior do objeto.
O método de conversão que pode ser criado para todas as primitivas aqui é um para string e int.
fonte
Para fazer com que o aplicativo se lembre dos últimos valores selecionados do girador, você pode usar o código abaixo:
O código abaixo lê o valor do girador e define a posição do girador de acordo.
E insira o código abaixo, onde você sabe que os valores mais recentes do girador estão presentes ou em outro lugar, conforme necessário. Esse trecho de código basicamente grava o valor do spinner em SharedPreferences.
fonte
Eu tive o mesmo problema ao tentar selecionar o item correto em um girador preenchido usando um cursorLoader. Recuperei o ID do item que desejava selecionar primeiro da tabela 1 e, em seguida, usei um CursorLoader para preencher o botão giratório. No onLoadFinished, passei pelo cursor preenchendo o adaptador do girador até encontrar o item que correspondia ao ID que já tinha. Em seguida, atribua o número da linha do cursor à posição selecionada do girador. Seria bom ter uma função semelhante para passar o ID do valor que você deseja selecionar no botão giratório ao preencher detalhes em um formulário contendo resultados salvos do botão giratório.
fonte
Como algumas das respostas anteriores estão muito corretas, só quero garantir que nenhum de vocês caia nesse problema.
Se você definir os valores para o
ArrayList
usoString.format
, você DEVE obter a posição do valor usando a mesma estrutura de stringString.format
.Um exemplo:
Você deve obter a posição do valor necessário assim:
Caso contrário, você obterá o
-1
item não encontrado!Eu usei
Locale.getDefault()
por causa da língua árabe .Espero que seja útil para você.
fonte
Aqui está minha solução esperançosamente completa. Eu tenho o seguinte enum:
usado na classe a seguir
Código para definir o controle giratório por HTTPMethod enum-member:
Onde
R.id.spinnerHttpmethod
é definido em um arquivo de layout eandroid.R.layout.simple_spinner_item
é entregue pelo android-studio.fonte
fonte
muito simples é só usar
getSelectedItem();
por exemplo :
o método acima retorna um valor de sequência
acima,
R.array.admin_type
há um arquivo de recursos de string em valoresbasta criar um arquivo .xml em values >> strings
fonte
Suponha que você precise preencher o botão giratório a partir da matriz de cadeias de caracteres do recurso e deseja manter o valor selecionado no servidor. Portanto, essa é uma maneira de definir um valor selecionado do servidor no botão rotativo.
Espero que ajude! PS o código está em Kotlin!
fonte
Como eu precisava de algo que também funciona com Localização , criei esses dois métodos:
Como você pode ver, também me deparei com uma complexidade adicional de distinção entre maiúsculas e minúsculas entre arrays.xml e a
value
que estou comparando. Se você não tiver isso, o método acima pode ser simplificado para algo como:return arrayValues.indexOf(value);
Método auxiliar estático
fonte
você precisa passar seu adaptador personalizado com uma posição como REPEAT [posição]. e funciona corretamente.
fonte