2011-11-10 81 views
6

我必須開發一個android視圖,以便我有2個微調控件,其中一個用於狀態,另一個用於城市。(動態)多個紡紗國家/城市

我的問題是,如何在每次選擇狀態時自動填充城市微調器?

它背後的邏輯是什麼?

我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> 

我的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> 

而且我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); 

    } 
} 

回答

5

這是正確的做法親愛....

我已經寫了所有必要的州和城市string_arays ....

<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 

然後在主XML添加兩個都是兩個旋轉器。我相信你所有的人都可以做我簡單的,吶?

然後我有我的main.xml爲...

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); 
     } 

只是檢查一看,自己做這件事...... 希望這將有助於ü一點點......

ķ親愛的朋友們.. Sujith

1

你要做的folloowing一步

  1. 創建城市的數據源(數據庫或hashmap(「州」,「城市」))。

  2. 將setOnItemSelectedListener(偵聽器)設置爲包含狀態的微調器。

  3. 上述列表程序的onItemSelected()方法從第一步創建的datasouce中獲取數據並將其附加到城市微調器。

那就是它。

+0

u能breif呢? - 我是新來的android ... –

+0

看到我的答案,它解釋了步驟2和步驟3 - NB步驟1有一個錯誤:它需要是一個HashMap <狀態,列表>;) – Guillaume

+0

感謝Guillaume的糾正 –

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 
      } 
     }); 
    } 
} 

注:在StackOverflow的編輯器編碼的,可能有一些語法錯誤:)

查找每個州的城市,使用任何你想要的方法:你可以在多個字符串數組定義它們資源,或從數據庫中得到他們,等

10

例子:

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) { 

     } 
    }); 

現在,

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); 
} 

這是最簡單的例子。你可以從你的數據庫中設置你的city_optionsstate_options,然後你可以用它來填充accoring spinners。

+0

非常感謝你親愛的...... –

+0

知道了親愛的...... –

+0

其實我是這個網站的新手。任何人都可以說我怎麼接受這個答案? –