1. 程式人生 > 實用技巧 >吳裕雄--天生自然ANDROID開發學習:2.5.3 Spinner(列表選項框)的基本使用

吳裕雄--天生自然ANDROID開發學習:2.5.3 Spinner(列表選項框)的基本使用

1.相關屬性
android:dropDownHorizontalOffset:設定列表框的水平偏移距離
android:dropDownVerticalOffset:設定列表框的水平豎直距離
android:dropDownSelector:列表框被選中時的背景
android:dropDownWidth:設定下拉列表框的寬度
android:gravity:設定裡面元件的對其方式
android:popupBackground:設定列表框的背景
android:prompt:設定對話方塊模式的列表框的提示資訊(標題),只能夠引用string.xml 中的資源id,而不能直接寫字串
android:spinnerMode:列表框的模式,有兩個可選值: dialog:對話方塊風格的視窗 dropdown:下拉選單風格的視窗(預設)
可選屬性:android:entries:使用陣列資源設定下拉列表框的列表專案
2.使用示例:
Spinner會預設選中第一個值,就是預設呼叫spinner.setSection(0), 你可以通過這個設定預設的選中值,另外,會觸發一次OnItemSelectedListener 事件,暫時沒找到解決方法,下面折衷的處理是:新增一個boolean值,然後設定 為false,在onItemSelected時進行判斷,false說明是預設觸發的,不做任何操作 將boolean值設定為true;true的話則正常觸發事件! 示例中寫了兩個不同的Spinner,從資料來源,列表框風格等進行對比

程式碼實現:

這裡依然使用的我們前面的可複用BaseAdapter:

第一個Spinner的資料來源編寫:

在res/values下編寫一個:myarrays.xml的檔案,內容如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="data">
        <item>英勇青銅</item>
        <item>不屈白銀</item>
        <item>榮耀黃金</item>
        <item>華貴鉑金</item>
        <item>璀璨鑽石</item>
        <item>超凡大師</item>
        <item>最強王者</item>
    </string-array>
</resources>
接著是第二個Spinner的佈局:item_spin_hero.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="5dp">

    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:src="@mipmap/iv_lol_icon1" />

    <TextView
        android:id="@+id/txt_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"
        android:text="德瑪西亞"
        android:textSize="16sp" />

</LinearLayout>
再接著編寫一個Entitiy實體類:Hero.java:

/**
 * Created by Jay on 2015/9/24 0024.
 */
public class Hero {

    private int hIcon;
    private String hName;

    public Hero() {
    }

    public Hero(int hIcon, String hName) {
        this.hIcon = hIcon;
        this.hName = hName;
    }

    public int gethIcon() {
        return hIcon;
    }

    public String gethName() {
        return hName;
    }

    public void sethIcon(int hIcon) {
        this.hIcon = hIcon;
    }

    public void sethName(String hName) {
        this.hName = hName;
    }
}
最後是MainActivity的佈局與Java程式碼部分:

佈局檔案:activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp"
    tools:context=".MainActivity">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="選擇您的排位分段"
        android:textColor="#44BDED"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/spin_one"
        android:layout_width="100dp"
        android:layout_height="64dp"
        android:entries="@array/data"
        android:prompt="@string/spin_title"
        android:spinnerMode="dialog" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="選擇你的拿手英雄~"
        android:textColor="#F5684A"
        android:textSize="18sp" />

    <Spinner
        android:id="@+id/spin_two"
        android:layout_width="wrap_content"
        android:layout_height="64dp" />

</LinearLayout>
MainActivity.java:

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private Spinner spin_one;
    private Spinner spin_two;
    private Context mContext;
    //判斷是否為剛進去時觸發onItemSelected的標誌
    private boolean one_selected = false;
    private boolean two_selected = false;
    private ArrayList<Hero> mData = null;
    private BaseAdapter myAdadpter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        mData = new ArrayList<Hero>();
        bindViews();
    }


    private void bindViews() {
        spin_one = (Spinner) findViewById(R.id.spin_one);
        spin_two = (Spinner) findViewById(R.id.spin_two);

        mData.add(new Hero(R.mipmap.iv_lol_icon1,"迅捷斥候:提莫(Teemo)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon2,"諾克薩斯之手:德萊厄斯(Darius)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon3,"無極劍聖:易(Yi)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon4,"德萊厄斯:德萊文(Draven)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon5,"德邦總管:趙信(XinZhao)"));
        mData.add(new Hero(R.mipmap.iv_lol_icon6,"狂戰士:奧拉夫(Olaf)"));

        myAdadpter = new MyAdapter<Hero>(mData,R.layout.item_spin_hero) {
            @Override
            public void bindView(ViewHolder holder, Hero obj) {
                holder.setImageResource(R.id.img_icon,obj.gethIcon());
                holder.setText(R.id.txt_name, obj.gethName());
            }
        };
        spin_two.setAdapter(myAdadpter);
        spin_one.setOnItemSelectedListener(this);
        spin_two.setOnItemSelectedListener(this);

    }


    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        switch (parent.getId()){
            case R.id.spin_one:
                if(one_selected){
                    Toast.makeText(mContext,"您的分段是~:" + parent.getItemAtPosition(position).toString(),
                            Toast.LENGTH_SHORT).show();
                }else one_selected = true;
                break;
            case R.id.spin_two:
                if(two_selected){
                    TextView txt_name = (TextView) view.findViewById(R.id.txt_name);
                    Toast.makeText(mContext,"您選擇的英雄是~:" + txt_name.getText().toString(),
                            Toast.LENGTH_SHORT).show();
                }else two_selected = true;
                break;
        }
    }

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

    }
}