1. 程式人生 > >安卓入門--Spinner控制元件與二級聯動詳解

安卓入門--Spinner控制元件與二級聯動詳解

SPinner

  • 父類:AbsSpinner–AdapterView
  • 定義:下拉選單控制元件

常用方法:

  • android:spinnerMode:

    1. dialog---對話方塊模式
    2. dropdown--下拉模式
    
  • dropdown效果

    這裡寫圖片描述

  • dialog效果:
    這裡寫圖片描述

  • android:prompt(標題的設定)

    1. 僅僅只有在spinnerMode:dialog下才能生效
    1. ="@string/name2"(需要通過@string/的方式去獲得不可直接賦值)
    

這裡寫圖片描述
* android:entries

    這個格式是規定的 @後面不是檔名。
    因為這是android裡面的約定 資原始檔裡面的陣列都用R.array.xxx表示
    就如同要找到元件佈局必須用R.layout.xxx表示一樣
    citys是陣列名 存在values下宣告:
    <string-array name="citys">
            <item >北京</item>
            <item >上海</item>
            <item >成都</item>
            <item >南京</item>
        </string-array>

    但在實際開發中不建議這麼用,這種模式是寫死了,如果需要改動很麻煩只需要瞭解即可
  • android:popupBackground(背景顏色)

    1. 為下拉區域給定一個顏色
    2. 只有當spinnerMode為:dropdown是才生效
    
  • 背景顏色的改變
    這裡寫圖片描述

Spinner以程式碼方式展示Spinner選項

  • 陣列型別
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import
android.widget.Spinner; /** * * @author sKy° * Spinner:使用介面卡繫結資料來源為 "陣列型別" 的資料 * @d2016-5-13 */ public class MainActivity extends Activity { // 初始化所需資料 private Spinner spinner; private ArrayAdapter<String> adapter; private String[] data; @Override protected void onCreate
(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 找到spinner控制元件 spinner=(Spinner) findViewById(R.id.sp); // 建立資料來源 data=new String[]{"東京","成都","上海","南京"}; // 資料來源與介面卡繫結 adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); // Spinner控制元件與介面卡繫結 spinner.setAdapter(adapter); } }
  • 集合型別
import java.util.ArrayList;
import java.util.List;

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

/**
 * 
 * @author sKy° 
 * 2.Spinner:使用介面卡繫結資料來源為 "集合型別" 的資料
 * @d2016-5-13
 * 
 */
public class secendActivity extends Activity {
//      初始化資料
    private Spinner spinner;
    private List<String> data;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//      通過id獲得控制元件
        spinner = (Spinner) findViewById(R.id.sp);
//      建立資料來源   (也可以寫一個方法,通過迴圈遍歷去新增集合元素)
        data=new ArrayList<String>();
        data.add("北京");
        data.add("成都");
        data.add("上海");
        data.add("南京");
//      資料來源與介面卡繫結
        adapter=new ArrayAdapter<String>(this, 
                android.R.layout.simple_list_item_1,
                data);
//      Spinner控制元件繫結介面卡
        spinner.setAdapter(adapter);
    }




}
  • 效果:
    這裡寫圖片描述

  • Spinner二級連動設定

  • 分析: 二級聯動 是由第一級控制元件觸發點選事件後第二級的控制元件去給出對應的值
         比如輸入第一級控制元件選擇為北京那麼第二級控制元件就會給出所屬的對應區  
         北京----東城、西城、宣武這樣的 一個效果
    思路:1.建立資料來源、設定Spinner控制元件
         2.把對應的"市"作為一個數據源  把該市對應的"區"又作為一個數據源,由此我們這裡就需要兩個資料來源(市、區)
         3.因為是由第一個控制元件觸發點選事件後 第二個控制元件的值會對應的給出,所以我們只需要對第一個控制元件進行一個監聽,時刻監聽第一個控制元件
         的觸發的事件去給第二個控制元件賦值
         4.最後是Spinner控制元件去繫結對應的介面卡,對應的給出介面卡繫結對應的資料來源,完成!
    
  • 控制元件設定部分:
    這裡寫圖片描述

  • 對應的類獲取對應的資料(市、區)部分:
    這裡寫圖片描述

這裡寫圖片描述

  • mainActivity程式碼部分:
package com.example.adapter;

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

import com.entiy.place.Citys;
import com.entiy.place.Province;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
/**
 * 
 * @author sKy°
 * 程式碼部分
 * @d2016-5-13
 */
public class ThreeActivity extends Activity implements OnItemSelectedListener{
    private Spinner spinner1, spinner2;
    private List<Citys> data;
    private List<Province> provinces;
    private List<String> city;
    private ArrayAdapter<String> adapter1,adapter2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//      通過資源ID找到控制元件
        spinner1 = (Spinner) findViewById(R.id.sp);
        spinner2 = (Spinner) findViewById(R.id.sp1);
//      建立資料來源
        getData();
        getPriovince();
//      資料來源與第一級的介面卡
        adapter1 = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                city);
        spinner1.setAdapter(adapter1);
        spinner1.setOnItemSelectedListener(this);
    }   

//  重寫OnItemSelectedListener方法
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position,
            long id) {
//  設定第二個控制元件給定資料來源繫結介面卡           
                String p_name = city.get(position).trim();
                List<String> citys = getCitys(p_name);

                adapter2=new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1, 
                        citys);
                spinner2.setAdapter(adapter2);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // TODO Auto-generated method stub

    }
//   設定一個方法   把資料(市、區)裝到對應的集合裡面
    private void getData(){
//      建立集合 把city資料新增到集合
        data=new ArrayList<Citys>();
        provinces=new ArrayList<Province>();
        Citys citys=null;
        Province province=null;
//      北京市區
        citys=new Citys("東城");
        data.add(citys);
        citys=new Citys("西城");
        data.add(citys);
        citys=new Citys("宣武");
        data.add(citys);
        province=new Province("北京", data);
        provinces.add(province);

//      上海市區
        data=new ArrayList<Citys>();   
        citys=new Citys("黃浦");
        data.add(citys);
        citys=new Citys("盧灣");
        data.add(citys);
        citys=new Citys("嘉定");
        data.add(citys);
        province=new Province("上海", data);
        provinces.add(province);

//      成都市區
        data=new ArrayList<Citys>();
        citys=new Citys("青羊");
        data.add(citys);
        citys=new Citys("錦江");
        data.add(citys);
        citys=new Citys("武侯");
        data.add(citys);
        province=new Province("成都", data);
        provinces.add(province);

//      天津市區
        data=new ArrayList<Citys>();
        citys=new Citys("塘沽");
        data.add(citys);
        citys=new Citys("薊縣");
        data.add(citys);
        citys=new Citys("寶坻");
        data.add(citys);
        province=new Province("天津", data);
        provinces.add(province);
    }
//  通過遍歷集合獲得市的名字 --備用賦值給Spinner1
    private void getPriovince(){
            city=new ArrayList<String>();
            for (Province province : provinces) {
                String cityname = province.getP_name();
                city.add(cityname);
            }

    }
//  通過市獲得區--備用賦值給Spinner2
    private List<String> getCitys(String c_name){
    List<String> citylist=new ArrayList<String>();
        for (Province province : provinces) {
            if (c_name.equals(province.getP_name())) {
                    List<Citys> citys = province.getCitys();
                    for (Citys citys2 : citys) {
                        String cityName = citys2.getCity();
                        citylist.add(cityName);
                    }
            }

        }

        return citylist;
    }

}


  • 二級聯動最終效果,可以看到當選擇為成都時給出了對應的區:
    這裡寫圖片描述

Adapter的三個引數

* Contex context:是一個上下文(這裡可以用this表示):
* int resource:需要繫結用於展示的一個Layout佈局
* T[] objects:泛型陣列,也可以用集合表示(注:Spinner介面卡只支援兩種資料1.泛型陣列 2.泛型集合)

原始碼裡面的解釋:
這裡寫圖片描述