2011-11-10 10 views
6

Devo sviluppare una vista Android in modo tale da avere 2 controlli di selezione, uno per lo stato e il secondo per le città.(dinamico) Multiple spinners stato/città

La mia domanda è, come posso popolare automaticamente lo spinner città ogni volta che viene selezionato uno stato?

Qual è la logica dietro?

mio string.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="spinner_category"></string> 
<string-array name="category_state"> 
    <item >kerala</item> 
    <item >tamil nadu</item> 
    <item >Andra Pradesh</item> 
    <item >karnataka</item> 
</string-array> 
</resources> 

mio main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <LinearLayout android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="10dip" 
      android:text="Select : "/> 
     <Spinner android:layout_width="250dip" 
      android:layout_height="wrap_content" 
      android:id="@+id/spinner_state"/> 
    </LinearLayout> 

<LinearLayout android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <TextView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="10dip" 
      android:text="Select : "/> 
     <Spinner android:layout_width="250dip" 
      android:layout_height="wrap_content" 
      android:id="@+id/spinner_state"/> 
    </LinearLayout> 
</LinearLayout> 

E il mio file activity.java:

package com.converter; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 

public class ConverterActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Spinner spinner_s = (Spinner)findViewById(R.id.spinner_state); 
     ArrayAdapter<CharSequence> category_adapter = ArrayAdapter.createFromResource(
       this, R.array.category_array, android.R.layout.simple_spinner_item); 
     category_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner_s.setAdapter(category_adapter); 

    } 
} 

risposta

5

Ecco il modo corretto cara ....

avevo scritto tutti gli stati e le città necessari string_arays ....

come

<string-array name="State_array"> 
      <item >s1</item> 
      <item >s2</item> 
      <item >s3</item> 
      <item >s4</item> 
    </string-array> 
//then cities array for each states, like 
<string-array name="State1Cities_array"> 
      <item >c11</item> 
      <item >c12</item> 
      <item >c15</item> 
      <item >c13</item> 
    </string-array> 
<string-array name="State2Cities_array"> 
      <item >c1</item> 
      <item >c2</item> 
      <item >c5</item> 
      <item >c3</item> 
    </string-array> 

// and so on for all the states 

poi in XML principale aggiunto 2 filatori per entrambi. credo che tu possa fare tutto io, na?

poi ho il mio main.xml come ...

spinner_states_activity = (Spinner)findViewById(R.id.spinner_states_main); 
     spinner_states_activity.setOnItemSelectedListener(this); 
     adapter = ArrayAdapter.createFromResource(
       this, R.array.state_array, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(R.layout.myspinner); 
// my layout for spinners u can use urs or defalut. k? 
     spinner_states_activity.setAdapter(adapter); 

spinner_cities_activity = (Spinner)findViewById(R.id.spinner_cities_main); 
     spinner_cities_activity.setOnItemSelectedListener(this); 

//and in function onItemSelected 

     int pos,pos2; 
     pos = spinner_states_activity.getSelectedItemPosition(); 
     int iden=parent.getId(); 
     if(iden==R.id.spinner_states_main) 
     { 
      pos2 = 0; 
      switch (pos) 
      { 
       case 0: unit_adapter= ArrayAdapter.createFromResource(
          this, R.array.States1Cities_array, android.R.layout.simple_spinner_item); 
         break; 
       case 1: unit_adapter= ArrayAdapter.createFromResource(
          this, R.array.States3Cities_array, android.R.layout.simple_spinner_item); 
         break; 
         // all the StatesxCities entires.... 
       default: 
         break; 
      } 

      spinner_cities_activity.setAdapter(unit_adapter); 
      unit_adapter.setDropDownViewResource(R.layout.myspinner); 
     } 

Basta controllare un'occhiata e fare da soli ... auguriamo che questo aiuta u un po '...

k cari amici .. Sujith

1

Devi fare il passo folloowing

  1. crea origine dati di città (database o in hashmap ("stato", "città")).

  2. imposta setOnItemSelectedListener (listener) agli stati contenenti spinner.

  3. onItemSelected() metodo del listener precedente recuperare i dati dal datasouce creato nel primo passaggio e collegarlo a città spinner.

questo è tutto.

+0

può u Breif esso? Sono nuovo ad Android ... –

+0

vedere la mia risposta, che esplicita i passaggi 2 e 3. - NB c'è un errore sul passaggio 1: deve essere uno HashMap >;) – Guillaume

+0

grazie Guillaume per la correzione –

1
public class ConverterActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Spinner citySpinner = (Spinner)findViewById(R.id.spinner_city); 
     final ArrayAdapter<String> cityAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, new String[]); // starts empty 
     city_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner_city.setAdapter(city_adapter); 

     Spinner categorySpinner = (Spinner)findViewById(R.id.spinner_state); 
     final ArrayAdapter<String> categoryAdapter = ArrayAdapter.createFromResource(
       this, R.array.category_array, android.R.layout.simple_spinner_item); 
     categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     categorySpinner.setAdapter(category_adapter); 
     categorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       String selectedState = parent.getItemAtPosition(position); 
       cityAdapter.clear(); // remove previous entries 
       // look up your cities for the state selectedState, using your own method 
       cityAdapter.add(the cities you want); // do that in a loop for all your cities 
       cityAdapter.notifyDataSetChanged(); 
      }; 
      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       // do nothing 
      } 
     }); 
    } 
} 

NB: codificato nel editor di StackOverflow, ci potrebbero essere alcuni errori di sintassi :)

di ricercare le città per ogni stato, usare qualsiasi metodo che si desidera: è possibile definirli in più stringhe-array risorse, o farli da un database, ecc

10

Esempio:

Spinner city=(Spinner)findViewById(R.id.citySpinner); 
    Spinner state=(Spinner)findViewById(R.id.stateSpinner); 

    final ArrayList<String> state_options=new ArrayList<String>(); 
    final ArrayList<String> city_options=new ArrayList<String>(); 

    state_options.add("state_1"); 
    state_options.add("state_2"); 
    state_options.add("state_3"); 
    // Here you can also get a cursor and add Strings as options to state_options instead of what i have done 

    city_options.add("city_1_state_1"); 
    city_options.add("city_2_state_1"); 
    city_options.add("city_3_state_1"); 
    // Here you can also get a cursor and add Strings as options to city_options instead of what i have done 

    ArrayAdapter<String> cityAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item,city_options); 
    city.setAdapter(cityAdapter); 

    ArrayAdapter<String> stateAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item,state_options); 
    state.setAdapter(stateAdapter); 

    state.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View view, 
         int position, long id) { 

      String stateName=state_options.get(position).toString(); 
       resetCity(stateName);        
     } 

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

     } 
    }); 

Ora,

public void resetCity(String stateName) 
{  
     city_options.removeAll(city_options);//i haven't checked this. 
     if(stateName.eqauls("state_1")) 
     { 
      city_option.add("city_1_state_1"); 
      city_options.add("city_2_state_1"); 
      city_options.add("city_3_state_1"); 
      //you can also get a cursor and add Strings as options to city_options instead of what i have done 
     } 
     else if(stateName.eqauls("state_2")) 
     { 
      city_option.add("city_1_state_2"); 
      city_options.add("city_2_state_2"); 
      city_options.add("city_3_state_2"); 
      // you can also get a cursor and add Strings as options to city_options instead of what i have done 
     } 
     else 
     { 
      city_option.add("city_1_state_3"); 
      city_options.add("city_2_state_3"); 
      city_options.add("city_3_state_3"); 
      //you can also get a cursor and add Strings as options to city_options instead of what i have done 
     } 

     ArrayAdapter<String> cityAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item,city_options); 
     city.setAdapter(cityAdapter); 
} 

Questo è l'esempio più semplice. È possibile impostare il proprio city_options e state_options dal proprio database e quindi utilizzarlo per compilare i filatori.

+0

Grazie mille caro .... –

+0

Ho capito caro ...... –

+0

in realtà sono nuovo in questo sito. qualcuno può dire come posso accettare la risposta? –