3
respostas

Preencher um Spinner a partir de outro

Estou consumindo meus dados do webservice usando retrofit, porém a activity da problema ao abrir ela:

Imagem

Código da activity do formulário de cadastro do animal

 public class FormAnimalActivity extends AppCompatActivity {

    private Spinner spinnerEspecies;
    private Spinner spinnerSubEspecies;

    private long selectedItemId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_form_animal);

        carregaSpinnerEspecieESubEspecie();

        spinnerEspecies = findViewById(R.id.spinner_especies);
        spinnerSubEspecies = findViewById(R.id.spinner_subEspecies);

    }

    public void carregaSpinnerEspecieESubEspecie() {

    //Fazendo uma call para o retrofit listar as Especies do banco
        final Call<List<Especie>> especieCall = new RetrofitInicializador().getEspecieService().listar();

        especieCall.enqueue(new Callback<List<Especie>>() {
            @Override
            public void onResponse(Call<List<Especie>> call, Response<List<Especie>> response) {

        //Pegando a lista de espécies no corpo da requisição e colocando um adapter para exibir no spinner
                List<Especie> especies = response.body();

                ArrayAdapter<Especie> adapter = new ArrayAdapter<Especie> (FormAnimalActivity.this, android.R.layout.simple_list_item_1, especies);
                spinnerEspecies.setAdapter(adapter);

        //Pegando o id do item selecionado e guardando na variável selectedItemId
                selectedItemId = spinnerEspecies.getSelectedItemId();

        //Fazendo uma outra call, porém trazendo as *SubEspécies* cujo id da *Espécie* está salvo na variável *selectedItemId*
                final Call<List<SubEspecie>> subEspecieCall = new RetrofitInicializador().getEspecieService().listarSubEspecies(selectedItemId);

                subEspecieCall.enqueue(new Callback<List<SubEspecie>>() {
                    @Override
                    public void onResponse(Call<List<SubEspecie>> call, Response<List<SubEspecie>> response) {

                        final List<SubEspecie> subEspecies = response.body();

                        final ArrayAdapter<SubEspecie> adapter = new ArrayAdapter<>(FormAnimalActivity.this, android.R.layout.simple_dropdown_item_1line, subEspecies);
                        spinnerSubEspecies.setAdapter(adapter);

                    }

                    @Override
                    public void onFailure(Call<List<SubEspecie>> call, Throwable t) {

                    }
                });
            }

            @Override
            public void onFailure(Call<List<Especie>> call, Throwable t) {

            }
        });

    }
}
3 respostas

Não retornou nenhuma mensagem de errro?

Então, eu tenho dois Spinners...

Primeiro Spinner é para mostrar as Espécies: (Cachorro, Gato, Ave, Réptil)

Com base no que for selecionado no Spinner acima, irá mostrar as SubEspécies, caso selecionado Cachorro: (Pitbull, Labrador, Dalmata, Vira-lata)

Porém estou com problema ao pegar o id do primeiro spinner selecionado, no caso a linha:

//Pegando o id do item selecionado e guardando na variável selectedItemId.
selectedItemId = spinnerEspecies.getSelectedItemId();

Quando eu vou debugar, essa linha está retornando null, logo n consigo trazer os dados do Spinner seguinte.

E se você usasse OnClickListener. Este método é para atividades de menu.

Use item.getItemId() ao invés. Aqui está um exemplo:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.menu.do_stuff: {
                // Do stuff
            } case R.menu.do_stuff2: {
                // Do other stuff
            }
    }
}