Definir item selecionado do girador programaticamente


384

Estou trabalhando em um projeto Android e estou usando um spinner que usa um adaptador de matriz que é preenchido no banco de dados.

Não consigo descobrir como definir o item selecionado programaticamente a partir da lista. Por exemplo, se, no botão giratório, tiver os seguintes itens:

  • Categoria 1
  • Categoria 2
  • Categoria 3

Como programaticamente tornaria a Categoria 2 o item selecionado quando a tela é criada. Eu estava pensando que poderia ser semelhante ao c # IE Spinner.SelectedText = "Category 2", mas não parece haver nenhum método semelhante a este para o Android.


Por favor, siga este link: [Como definir a seleção no item giratório] [1] [1]: stackoverflow.com/questions/16358563/…
Maddy

11
Você pode passar seu índice para spinner.setSelection(). Isso funcionaria muito bem. Você também pode criar um método que pode ajudá-lo a corresponder seus índices às respectivas seqüências de caracteres.
Taslim Oseni

Respostas:


737

Use o seguinte: spinnerObject.setSelection(INDEX_OF_CATEGORY2).


287
Obrigado, isso funcionou muito bem, enquanto eu fazia isso, também encontrei uma maneira de obter o índice sem precisar percorrer o adaptador. Eu usei o seguinte #mySpinner.setSelection(arrayAdapter.getPosition("Category 2"));
Boardy

86
caso você não tenha o adaptador para referência. mySpinner.setSelection (((ArrayAdapter) mySpinner.getAdapter ()). getPosition ("Value"));
precisa saber é o seguinte

3
sexSpinner.setSelection (adapter.getPosition (mUser.getGender ()) == -1? 0: adapter.getPosition (mUser.getGender ()));
Goofyahead

chamar SetSelection () logo após setAdapter () parece exibir o primeiro item sempre (Android 2.3), até o bom é selecionado no dropView. adicionar view.post () (resposta de @Marco Hernaiz Cao) corrige para mim.
Christ

3
Isso não funciona se o Spinner tiver um onItemSelectedListener (). O ouvinte não será chamado.
Don Larynx

80

Nenhuma dessas respostas me deu a solução, apenas trabalhou com isso:

mySpinner.post(new Runnable() {
    @Override
    public void run() {
        mySpinner.setSelection(position);
    }
});

3
Eu chamo SetSelection () logo após setAdapter (). Isso exibe o primeiro item sempre (Android 2.3), mesmo o bom é selecionado no dropView. Sua solução fez isso por mim.
Christ

2
Obrigado, isso funcionou! btw funciona para ListView.post.run () performItemClick () também
Michael D.

Como posso selecionar o último com base no tamanho?
jvargas 12/03

41
public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SimpleCursorAdapter adapter = (SimpleCursorAdapter) spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}

Você pode usar o acima, como:

selectSpinnerItemByValue(spinnerObject, desiredValue);

e, claro, você também pode selecionar por índice diretamente como

spinnerObject.setSelection(index);

Um erro com esse código é que @Boardy deseja que a seleção Category 2seja uma String (supondo que ele tenha tentado usar Spinner.SelectedText = "Category 2"), mas o código acima é para a long.
Arun George

Ele está preenchendo as categorias do banco de dados, deve haver um ID para cada categoria.
Yaqub Ahmad

11
Por que supor que é um CursorAdapter? O SpinnerAdapter também funciona.
Greg Ennis

Eu acho que você tem um erro aqui, deveria ser adapter.getItem(position), não adapter.getItemId(position).
Vadim Kotov

29

Alguma explicação (pelo menos para Fragmentos - nunca tentei com Atividade pura). Espero que ajude alguém a entender melhor o Android.

A resposta mais popular de Arun George está correta, mas não funciona em alguns casos.
A resposta de Marco HC usa Runnable, que é o último recurso devido à carga adicional da CPU.

A resposta é - você deve simplesmente escolher o local correto para chamar setSelection () , por exemplo, funciona para mim:

@Override
public void onResume() {
    super.onResume();

    yourSpinner.setSelection(pos);
 }

Mas não funcionará em onCreateView () . Suspeito que essa seja a razão do interesse neste tópico.

O segredo é que, com o Android, você não pode fazer o que quiser em qualquer método - oops :( - os componentes podem não estar prontos. Como outro exemplo - você não pode rolar o ScrollView nem no onCreateView () nem no onResume () ( veja a resposta aqui )


Obrigado - eu não sabia que o Fragments tinha o método onResume.
Home

Eu poderia dar um +18 para que sua resposta estivesse acima dos @Marco HC's. Você é o único a tentar fazer as coisas do jeito que é para ser feito
Vedant

15

Para encontrar um valor e selecioná-lo:

private void selectValue(Spinner spinner, Object value) {
    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).equals(value)) {
            spinner.setSelection(i);
            break;
        }
    }
}

12

Por que você não usa seus valores do banco de dados e os armazena em um ArrayList e depois usa:

yourSpinner.setSelection(yourArrayList.indexOf("Category 1"));

11
As várias soluções usando o DataAdapter não funcionaram para mim, mas o ArrayList do qual os valores foram criados neste exemplo foi o que fez.
eWall

8

A solução ideal é:

    public String[] items= new String[]{"item1","item2","item3"};
    // here you can use array or list 
    ArrayAdapter adapter= new ArrayAdapter(Your_Context, R.layout.support_simple_spinner_dropdown_item, items);
    final Spinner itemsSpinner= (Spinner) findViewById(R.id.itemSpinner);
itemsSpinner.setAdapter(adapter);

Para obter a posição do item, adicione automaticamente a seguinte declaração

itemsSpinner.setSelection(itemsSpinner.getPosition("item2"));

7

Você pode criar um método genérico para esse tipo de trabalho, como faço na minha UtilityClass, que é

public void SetSpinnerSelection(Spinner spinner,String[] array,String text) {
    for(int i=0;i<array.length;i++) {
        if(array[i].equals(text)) {
            spinner.setSelection(i);
        }
    }
}

5

Você pode definir facilmente assim: em spinner.setSelection(1)vez de 1, você pode definir qualquer posição da lista que gostaria de mostrar.


4

Eu tenho um SimpleCursorAdapter, então eu tenho que duplicar os dados para usar o respose nesta postagem. Então, eu recomendo que você tente desta maneira:

for (int i = 0; i < spinnerRegion.getAdapter().getCount(); i++) {
    if (spinnerRegion.getItemIdAtPosition(i) == Integer
        .valueOf(signal.getInt(signal
            .getColumnIndexOrThrow("id_region")))) {
        spinnerRegion.setSelection(i);
        break;
    }
}

Eu acho que é uma maneira real


11
sim, no caso de SimpleCursorAdapter, spinnerRegion.getItemIdAtPosition (i) fornece um Cursor, que pode ser usado para obter as colunas.
Lalitm

3

Isso é trabalho para mim.

 spinner.setSelection(spinner_adapter.getPosition(selected_value)+1);

e o +1?
SHADOW.NET

Porque é começar a partir de 0 por isso temos de acrescentar um para obter resposta certa
Arpit Patel

2

Se você possui uma lista de contatos, pode fazer isso:

((Spinner) view.findViewById(R.id.mobile)).setSelection(spinnerContactPersonDesignationAdapter.getPosition(schoolContact.get(i).getCONT_DESIGNATION()));

2

Eu sei que já está respondido, mas código simples para selecionar um item, muito simples:

spGenre.setSelection( ( (ArrayAdapter) spGenre.getAdapter()).getPosition(client.getGenre()) );

2
  for (int x = 0; x < spRaca.getAdapter().getCount(); x++) {
            if (spRaca.getItemIdAtPosition(x) == reprodutor.getId()) {
                spRaca.setSelection(x);
                break;
            }
        }

4
Você poderia adicionar um pouco de texto para explicar sua resposta?
Kmeixner

2

Isso é afirmado em comentários em outras partes desta página, mas consideramos útil extrair uma resposta:

Ao usar um adaptador, descobri que isso spinnerObject.setSelection(INDEX_OF_CATEGORY2)precisa ocorrer após a setAdapterchamada; caso contrário, o primeiro item será sempre a seleção inicial.

// spinner setup...
spinnerObject.setAdapter(myAdapter);
spinnerObject.setSelection(INDEX_OF_CATEGORY2);

Isso é confirmado revisando o código AbsSpinner para setAdapter.


Obviamente, você pode selecionar um item somente após o adaptador ter sido preenchido.
CoolMind 12/12

2

Isto é o que eu uso no Kotlin:

spinner.setSelection(resources.getStringArray(R.array.choices).indexOf("Choice 1"))

se indexOfnão conseguir fazer uma correspondência, ele retornará -1, o que parece resultar no valor padrão selecionado por spinner.setSelection. Eu estou bem com isso.
lasec0203

0

No meu caso, esse código salvou meu dia:

public static void selectSpinnerItemByValue(Spinner spnr, long value) {
    SpinnerAdapter adapter = spnr.getAdapter();
    for (int position = 0; position < adapter.getCount(); position++) {
        if(adapter.getItemId(position) == value) {
            spnr.setSelection(position);
            return;
        }
    }
}

Você não precisa fazer isso. O adaptador possui uma chamada getPosition (item) que retorna int position.
Tzg 15/04

0

Na maioria das vezes spinner.setSelection(i); //i is 0 to (size-1) of adapter's size não funciona. Se você acabou de ligarspinner.setSelection(i);

Depende da sua lógica.

Se o modo de exibição estiver totalmente carregado e você quiser chamá-lo da interface, sugiro que você chame

spinner.setAdapter(spinner_no_of_hospitals.getAdapter());
spinner.setSelection(i); // i is 0 or within adapter size

Ou, se você desejar alterar entre o ciclo de vida da atividade / fragmento, chame assim

spinner.post(new Runnable() {
  @Override public void run() {
    spinner.setSelection(i);
  }
});

0

Eu tinha criado uma função de extensão Spinnerpara carregar dados e rastrear a seleção de itens.

Spinner.kt

fun <T> Spinner.load(context: Context, items: List<T>, item: T? = null) {
    adapter = ArrayAdapter(context, android.R.layout.simple_spinner_item, items).apply {
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    }

    if (item != null && items.isNotEmpty()) setSelection(items.indexOf(item))
}

inline fun Spinner.onItemSelected(
    crossinline itemSelected: (
        parent: AdapterView<*>,
        view: View,
        position: Int,
        id: Long
    ) -> Unit
) {
    onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }

        override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
            itemSelected.invoke(parent, view, position, id)
        }
    }
}

Exemplo de uso

val list = listOf("String 1", "String 2", "String 3")
val defaultData = "String 2"

// load data to spinner
your_spinner.load(context, list, defaultData)

// load data without default selection, it points to first item
your_spinner.load(context, list)

// for watching item selection
your_spinner.onItemSelected { parent, view, position, id -> 
    // do on item selection
}

-1

Isso funcionou para mim:

@Override
protected void onStart() {
    super.onStart();
    mySpinner.setSelection(position);
}

É semelhante à solução de @ sberezin, mas chama setSelection () em onStart ().


-1

Infelizmente, o primeiro item na lista de matrizes é mostrado por padrão no widget giratório.Uma reviravolta seria encontrar o item selecionado anterior com cada elemento na lista de matrizes e trocar sua posição com o primeiro elemento. Aqui está o código.

OnResume()
{
int before_index = ShowLastSelectedElement();
if (isFound){
      Collections.swap(yourArrayList,before_index,0);
   }
adapter = new ArrayAdapter<String>(CurrentActivity.this,
                            android.R.layout.simple_spinner_item, yourArrayList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item;                    yourListView.setAdapter(adapter);
}
...
private int ShowLastSelectedElement() {
        String strName = "";
        int swap_index = 0;
        for (int i=0;i<societies.size();i++){
            strName = yourArrayList.get(i);
            if (strName.trim().toLowerCase().equals(lastselectedelement.trim().toLowerCase())){
                swap_index = i;
                isFound = true;
            }
        }
        return swap_index;
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.