City Spinner connected with State Spinner

2

I have 2 spinner in my application, one populated with the name of the states that I registered in the database in the firebase and another with the cities, they are linked by the state ID.

I managed to get both of them popular, but I can not get the cities of São Paulo, for instance, by clicking on São Paulo.

package com.example.reinaldo.tcc.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import com.example.reinaldo.tcc.R;
import com.example.reinaldo.tcc.model.Cidades;
import com.example.reinaldo.tcc.model.Estados;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

import static com.example.reinaldo.tcc.model.Local.InserirLocalFirebase;

public class AdicionarLocalActivity extends AppCompatActivity {

    private Spinner estado_spn;
    private Spinner cidade_spn;

    private ArrayAdapter<Estados> estadoArrayAdapter;
    private ArrayAdapter<Cidades> cidadeArrayAdapter;

    private ArrayList<Estados> estado;
    private ArrayList<Cidades> cidade;

    private DatabaseReference referencia = FirebaseDatabase.getInstance().getReference();

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adicionar_local);

        initializeUI();

    }

    private void initializeUI() {

        cidade_spn = findViewById(R.id.cidade_spn);
        estado_spn = findViewById(R.id.estado_spn);

        estado = new ArrayList<>();
        cidade = new ArrayList<>();

        Criarlista();

        estadoArrayAdapter = new ArrayAdapter<Estados>(AdicionarLocalActivity.this, android.R.layout.simple_spinner_item, estado);
        estadoArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        estado_spn.setAdapter(estadoArrayAdapter);

        cidadeArrayAdapter = new ArrayAdapter<Cidades>(AdicionarLocalActivity.this, android.R.layout.simple_spinner_item, cidade);
        cidadeArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        cidade_spn.setAdapter(cidadeArrayAdapter);

        estado_spn.setOnItemSelectedListener(estado_listener);
        cidade_spn.setOnItemSelectedListener(cidade_listener);

    }

    private AdapterView.OnItemSelectedListener estado_listener;

    {
        estado_listener = new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                parent.getItemAtPosition(position);


}
            };

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        };
    }

    private AdapterView.OnItemSelectedListener cidade_listener = new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    };



    private void Criarlista(){
        referencia.child("CIDADES").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                final List<String> cidade = new ArrayList<String>();

                for (DataSnapshot cidadeSnapshot : dataSnapshot.getChildren()) {
                    String cidadeNome = cidadeSnapshot.child("Nome").getValue(String.class);
                    cidade.add(cidadeNome);
                }

                cidade_spn = findViewById(R.id.cidade_spn);
                ArrayAdapter<String> cidadesAdapter = new ArrayAdapter<String>
                        (AdicionarLocalActivity.this, android.R.layout.simple_spinner_item, cidade);
                cidadesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                cidade_spn.setAdapter(cidadesAdapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        referencia.child("ESTADOS").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                final List<String> estado = new ArrayList<String>();

                for (DataSnapshot estadoSnapshot : dataSnapshot.getChildren()) {
                    String estadoNome = estadoSnapshot.child("Nome").getValue(String.class);
                    estado.add(estadoNome);
                }

                estado_spn = findViewById(R.id.estado_spn);
                ArrayAdapter<String> estadosAdapter = new ArrayAdapter<String>
                (AdicionarLocalActivity.this, android.R.layout.simple_spinner_item, estado);
                estadosAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                estado_spn.setAdapter(estadosAdapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

}

My code is like this until now, I do not know what to put in the state's OnItemSelectedListener to pull the cities in the other Spinner.

My classes are like this

State

public class Estados {

    private String estadoId;
    private String nome;
    private String sigla;

    public Estados(String id, String nome, String sigla) {
        this.estadoId = estadoId;
        this.nome = nome;
        this.sigla = sigla;
    }

    public String getEstadoId() {
        return estadoId;
    }

    public void setEstadoId(String id) {
        this.estadoId = estadoId;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSigla() {
        return sigla;
    }

    public void setSigla(String sigla) {
        this.sigla = sigla;
    }

    @Override
    public String toString() {
        return nome;
    }
}

And my City class looks like this:

public class Cidades  {

    private String cidadeId;
    private Estados estado;
    private String nome;

    public Cidades(String cidadeId, Estados estado, String nome) {
        this.cidadeId = cidadeId;
        this.estado = estado;
        this.nome = nome;
    }

    public String getCidadeId() {
        return cidadeId;
    }

    public void setCidadeId(String cidadeId) {
        this.cidadeId = cidadeId;
    }

    public Estados getEstado() {
        return estado;
    }

    public void setEstado(Estados estado) {
        this.estado = estado;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return nome;
    }

}
    
asked by anonymous 16.07.2018 / 02:02

1 answer

0

Reinaldo the list of cities should be populated only after a state has been selected. Using your code I exemplified within the onItemSelected state, but you can extract to a global variable the list of cities and in your method that creates your spinner of cities eg:

estado_listener = new AdapterView.OnItemSelectedListener() {
      @Override
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
      Object objeto = parent.getItemAtPosition(position);

     //Após obter o Objeto você pode acessar qualquer atributo de Estado 
    // apenas utilizando os getters.
      String nomeEstado = ((String) objeto).getNomeEstado();
      String idEstado = ((String) objeto).getEstadoId();

      //Com o idEstado você pode consultar no seu banco de dados na tabela Cidades         
      cidade = this.criarListaCidade(idEstado);

      //aqui é criado o Spinner de cidade já com as cidades filtradas por estado
      cidade_spn = findViewById(R.id.cidade_spn);

      //Agora você passa a lista de cidade como parametro para criação do seu spinner
      ArrayAdapter cidadesAdapter = new ArrayAdapter<this, android.R.layout.simple_spinner_item, cidade>);
   cidadesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    cidade_spn.setAdapter(cidadesAdapter);
    cidade_spn.setOnItemSelectedListener(...
    
20.07.2018 / 14:24