Android: crie spinner programaticamente a partir da matriz

198

Sou novo no Android e estou tentando criar um spinner programaticamente e alimentá-lo com dados de uma matriz, mas o Eclipse me dá um aviso que não consigo lidar.

Aqui está o que eu tenho:

Este ArrayList contém os elementos que devem estar no botão giratório (é preenchido a partir de um arquivo posteriormente):

ArrayList<String> spinnerArray = new ArrayList<String>();

Este é o código que encontrei em um site que deve criar o spinner:

Spinner spinner = new Spinner(this);
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this,
                android.R.layout.simple_spinner_dropdown_item,
                spinnerArray);
spinner.setAdapter(spinnerArrayAdapter);

Agora, a segunda linha (ArrayAdapter ...) me dá um aviso no Eclipse dizendo "ArrayAdapter is a raw type... References to generic type ArrayAdapter<T> should be parameterized": Eu não tenho idéia de como consertar isso (ou o que isso significa em primeiro lugar :)).

É apenas um aviso e o aplicativo parece funcionar bem, mas eu ainda gostaria de entender o que está errado e corrigi-lo. Qualquer dica é apreciada.

Saudações, Select0r

Select0r
fonte

Respostas:

388

ArrayAdapter<String> Deveria trabalhar.

ou seja:

Spinner spinner = new Spinner(this);
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>
            (this, android.R.layout.simple_spinner_item,
           spinnerArray); //selected item will look like a spinner set from XML
spinnerArrayAdapter.setDropDownViewResource(android.R.layout
                                                     .simple_spinner_dropdown_item);
spinner.setAdapter(spinnerArrayAdapter); 
Brandon O'Rourke
fonte
Eu tentei isso, mas o erro só muda um pouco :) Type safety: The expression of type ArrayAdapter needs unchecked conversion to conform to ArrayAdapter<String>
Select0r
2
Comentou rapidamente enquanto você editava sua postagem :) Perdi a segunda <String>, seu código funciona agora, muito obrigado!
Select0r
23
use ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(activity, R.layout.simple_spinner_item); spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);ou então um botão de opção pode aparecer no botão giratório em alguns dispositivos.
Ken
seu answere foi útil e você pode por favor me dizer que se eu estou usando dois spinners e eu quero se 1 girador só então segundo deve trabalhar
1
Ele também descreve esse método na documentação do Android: developer.android.com/guide/topics/ui/controls/spinner.html
WOUNDEDStevenJones
109

Da mesma maneira com Array

// Array of choices
String colors[] = {"Red","Blue","White","Yellow","Black", "Green","Purple","Orange","Grey"};

// Selection of the spinner
Spinner spinner = (Spinner) findViewById(R.id.myspinner);

// Application of the Array to the Spinner
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this,   android.R.layout.simple_spinner_item, colors);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // The drop down view
spinner.setAdapter(spinnerArrayAdapter);
Yann Masoch
fonte
Eu fiz isso usando um ArrayList porque minha matriz vem de um loop (não estático).
Jacksonkr
61

Isso funcionou para mim com um array de cadeias chamado shoescarregado a partir dos recursos do projeto:

Spinner              spinnerCountShoes = (Spinner)findViewById(R.id.spinner_countshoes);
ArrayAdapter<String> spinnerCountShoesArrayAdapter = new ArrayAdapter<String>(
                     this,
                     android.R.layout.simple_spinner_dropdown_item, 
                     getResources().getStringArray(R.array.shoes));
spinnerCountShoes.setAdapter(spinnerCountShoesArrayAdapter);

Este é o meu arquivo de recurso ( res/values/arrays.xml) com a string-array denominada shoes:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="shoes">
        <item>0</item>
        <item>5</item>
        <item>10</item>
        <item>100</item>
        <item>1000</item>
        <item>10000</item>
    </string-array>
</resources>

Com esse método, é mais fácil torná-lo multilíngue (se necessário).

Bruno Bieri
fonte
36

Isso realmente funcionou para mim

    Spinner spinner = new Spinner(this);
    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_spinner_item, spinnerArray);
    spinnerArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );

    spinner = (Spinner) findViewById( R.id.spinner );
    spinner.setAdapter(spinnerArrayAdapter);
Opy
fonte
6
Qual é o propósito deste Spinner spinner = new Spinner(this);quando você faz issospinner = (Spinner) findViewById( R.id.spinner );
MR5
por que erro: nenhum construtor adequado encontrado para o construtor ArrayAdapter (<anônimo OnItemSelectedListener>, int, DetailData) ArrayAdapter.ArrayAdapter (Contexto, int, int, Lista <>) não é aplicável?
user151968
6

este trabalho para mim: -

String[] array = {"A", "B", "C"};
String abc = "";


Spinner spinner = new Spinner(getContext());
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, array); //selected item will look like a spinner set from XML
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(spinnerArrayAdapter);

Eu estou usando um fragmento.

Arish Khan
fonte
3

Na linguagem Kotlin, você pode fazê-lo desta maneira:

val values = arrayOf(
    "cat",
    "dog",
    "chicken"
)

ArrayAdapter(
    this,
    android.R.layout.simple_spinner_item,
    values
).also {
    it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    spinner.adapter = it
}
Micer
fonte