2012-11-07

Android下拉選單(spinner)應用(四) - 三層連動式下拉選單

因為很多人看完了上篇連動式下拉選單後開始問我怎麼再加一層做三層連動下拉選單

而三層下拉在很多地方都會用到,如:最常用到的縣市鄉鎮選取,所以就抽空寫這篇好了

本人用的是最白痴的寫法(因為我懶),其實還有其他寫法,不過這個寫法最快(最懶)

而且最直覺,就直接把二層連動下拉選單中的二維陣列再加一個三維陣列的而已

夠簡單也夠直覺吧(夠懶),下面就直接po程式碼,看完您就會覺得就這樣而已喔

其實也就是這麼簡單而已,我直接從連動式下拉選單改來的,看程式碼吧。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    >
    <Spinner android:id="@+id/type" 
        android:layout_width="fill_parent" 
          android:layout_height="45dp"
          android:layout_marginLeft="75dp"
          android:layout_marginRight="20dp"
        android:layout_marginTop="7dp" 
         android:drawSelectorOnTop="true"
         android:layout_alignParentRight="true" 
    />
       <Spinner android:id="@+id/type2" 
        android:layout_width="fill_parent" 
          android:layout_height="45dp"
          android:layout_marginLeft="75dp"
          android:layout_marginRight="20dp"
          android:layout_marginTop="3dp" 
         android:drawSelectorOnTop="true"
         android:layout_alignParentRight="true" 
         android:layout_below="@id/type" 
         />


       <Spinner
           android:id="@+id/type3"
           android:layout_width="fill_parent"
           android:layout_height="45dp"
           android:layout_marginLeft="75dp"
           android:layout_marginRight="20dp"
           android:layout_marginTop="3dp"
           android:drawSelectorOnTop="true"
           android:layout_alignParentRight="true"
           android:layout_below="@+id/type2" />
      
</RelativeLayout>



TripleSpinnerActivity
package jim.demo.TripleSpinner;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;

public class TripleSpinnerActivity extends Activity {
 private String[] type = new String[] {"茶類", "果汁類"};//載入第一下拉選單
    private String[] tea = new String[]{"紅茶","綠茶","烏龍綠","青茶"};//起始畫面時預先載入第二下拉選單
    private String[] tea2 = new String[]{"紅茶超好喝","紅茶喝完臉會紅"};//起始畫面時預先載入第三下拉選單
    //第一下拉選取後載入第二下拉選單
    private String[][] type2 = new String[][]{{"紅茶","綠茶","烏龍綠","青茶"},{"柳丁汁","西瓜汁","烏梅汁"}};
    //第二下拉選取後載入第三下拉選單
    private String[][][] type3 = new String[][][]{{{"紅茶超好喝","紅茶喝完臉會紅"},{"綠茶超好喝","綠茶喝完臉會綠"},{"烏龍茶超好喝","烏龍茶超烏龍"},{"青茶超好喝","青茶很尚青"}},{{"柳丁汁超好喝","柳丁汁好棒"},{"西瓜汁超好喝","西瓜汁還可以"},{"烏梅汁超好喝","烏梅汁還可以"}}};
    private Spinner sp;//第一個下拉選單
    private Spinner sp2;//第二個下拉選單
    private Spinner sp3;//第三個下拉選單
    private Context context;

    ArrayAdapter<String> adapter ;

    ArrayAdapter<String> adapter2; 
    
    ArrayAdapter<String> adapter3; 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
         context = this;
        
        //程式剛啟始時載入第一個下拉選單
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, type); 
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        sp = (Spinner) findViewById(R.id.type); 
        sp.setAdapter(adapter);
        sp.setOnItemSelectedListener(selectListener);
        
        //因為下拉選單第一個為茶類,所以先載入茶類群組進第二個下拉選單
        adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, tea); 
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        sp2 = (Spinner) findViewById(R.id.type2);
        sp2.setAdapter(adapter2);
        sp2.setOnItemSelectedListener(selectListener2);
        
      //因為下拉選單第二個為紅茶,所以先載入紅茶群組進第三個下拉選單
        adapter3 = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, tea2); 
        adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
        sp3 = (Spinner) findViewById(R.id.type3);
        sp3.setAdapter(adapter3);
        
    }
    
    //第一個下拉類別的監看式
    private OnItemSelectedListener selectListener = new OnItemSelectedListener(){
        public void onItemSelected(AdapterView<?> parent, View v, int position,long id){
         //讀取第一個下拉選單是選擇第幾個
            int pos = sp.getSelectedItemPosition();
            //重新產生新的Adapter,用的是二維陣列type2[pos]
            adapter2 = new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item, type2[pos]);
            //載入第二個下拉選單Spinner
            sp2.setAdapter(adapter2);
        }
      
        public void onNothingSelected(AdapterView<?> arg0){

        }

    };
    
  //第二個下拉類別的監看式
    private OnItemSelectedListener selectListener2 = new OnItemSelectedListener(){
        public void onItemSelected(AdapterView<?> parent, View v, int position,long id){
         //讀取第一個下拉選單是選擇第幾個
            int pos = sp.getSelectedItemPosition();
         //讀取第二個下拉選單是選擇第幾個
            int pos2 = sp2.getSelectedItemPosition();
            //重新產生新的Adapter,用的是三維陣列type3[pos][pos2]
            adapter3 = new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item, type3[pos][pos2]);
            //載入第三個下拉選單Spinner
            sp3.setAdapter(adapter3);
        }
      
        public void onNothingSelected(AdapterView<?> arg0){

        }

    };
}



執行後畫面


選取第二個下拉選單

點選後第二個下拉和第三個下拉選單改變

第三個下拉選單內容也改變了

第一個下拉選單改變會連動其他二個下拉選單改變

說明:
          1.和連動式下拉選單其實改變的沒有很多,只是加入一個Spineer和一個三維陣列

          2.主要的內容要照著三維陣列內的設定,第一個下拉是類別、第二個下拉是品項

             、第三個下拉是評價,所以一開始下拉選單內的預設值因為第一個下拉的類別

             會預設為茶類,而第二下拉會是紅茶,所以第三個下拉就給它一維陣列紅茶的評價

          3.新增的第二個下拉選單選取監看式,new ArrayAdapter<String>產出的是一維陣列

             括號逗點前第一區只是下拉的樣式,所以不用管它,第二區帶入三維陣列

             給三維陣列type3第一和第二下拉的選取項就會產出一維陣列選項讓ArrayAdapter載入

             Spineer3中。

後記:

           以上說明應該清楚了,如有問題歡迎來信指教,謝謝。