2016年5月16日 星期一

Android 元件(Adapter) Spinner 下拉式選單的應用(靜態、動態)

Android 元件 Adapter、Spinner

1.基本應用:

使用介紹: Spinner 下拉式選單的應用(靜態)


關鍵圖示 :
記憶卡(資源) 種類非常多種,如果要把記憶卡的內容呈現在螢幕上(View),
       我們勢必要有一個轉接器,而這一個轉接器就是Adapter。


我們避免程式過於肥大 且不易閱讀,所以這樣改寫一下


我們開始來實現這個功能吧
JAVA
package com.example.andy.app_spinner;


import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;


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


public class MainActivity extends AppCompatActivity {
   private Context context;
   private Spinner spinner;
   private List<Integer> list;
   private ArrayAdapter<Integer> adapter;


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);


       findID();
       
       initialAdapter();
   }


   private void findID() {
       spinner = (Spinner) findViewById(R.id.spinner);
       context = this;
   }


   private void initialAdapter() {
       //我們先創造一個陣列,並再陣列放入幾個資料
       list = new ArrayList<Integer>();
       list.add(0);
       list.add(1);
       list.add(2);
       list.add(3);
       list.add(4);
       list.add(5);


       //我們再創造一個配接線 (Context,選單布局呈現方式,List<>)
       adapter = new ArrayAdapter<Integer>(context, android.R.layout.simple_spinner_item, list);


       //把設定完成的Adapter設定到 Spinner中
       //非常的抽象 所以我們可以用圖來表示。


       spinner.setAdapter(adapter);
       //當我們選擇 下拉式選單的 選項時需要做什麼事情,就必須@override這個方法
       spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
           @Override
           public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               Toast.makeText(context, list.get(position).toString(), Toast.LENGTH_SHORT).show();
           }
           
           @Override
           public void onNothingSelected(AdapterView<?> parent) {}
       });
   }



Layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:orientation="vertical"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context="com.example.andy.app_spinner.MainActivity"
   android:weightSum="1">


   <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">


       <Button
           android:onClick="onclick"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text=" + "
           android:id="@+id/btn_增加" />


       <Button
           android:onClick="onclick"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="-"
           android:id="@+id/btn_減少" />
   </LinearLayout>


   <Spinner
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/spinner"
       android:layout_gravity="center_horizontal"
       android:layout_weight="0.34" />


</LinearLayout>

實現後的預覽圖







2.延伸應用:



使用介紹:點擊按鈕,動態增加減少Spinner下拉式選單的選項

我們開始來實現這個功能吧
JAVA
package com.example.andy.app_spinner;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {
   private Context context;
   private Spinner spinner;
   private List<Integer> list;
   private ArrayAdapter<Integer> adapter;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       findID();
       
       initialAdapter();
   }

   private void findID() {
       spinner = (Spinner) findViewById(R.id.spinner);
       context = this;
   }

   private void initialAdapter() {
      
       list = new ArrayList<Integer>();
//先把靜態的註解掉
//        list.add(0);
//        list.add(1);
//        list.add(2);
//        list.add(3);
//        list.add(4);
//        list.add(5);
       adapter = new ArrayAdapter<Integer>(context, android.R.layout.simple_spinner_item, list);

      spinner.setAdapter(adapter);
       spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
           @Override
           public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               Toast.makeText(context, list.get(position).toString(), Toast.LENGTH_SHORT).show();
           }
           
           @Override
           public void onNothingSelected(AdapterView<?> parent) {}
       });
   }

   //開始實現動態的功能
   public void onclick(View view) {

      //中介者設計模式
       switch (view.getId()) {

           case R.id.btn_增加:
               //創造一個亂數,並記錄在number中
               int number = new Random().nextInt(100);
               //放進陣列中
               list.add(number);
               //讓adapter的參數給刷新
               adapter.notifyDataSetChanged();
               break;

           case R.id.btn_減少:
               //當陣列的大小>0 我才能執行
               if (list.size() > 0) {
               //陣列要刪除,第0個索引
                   list.remove(0);
               }
               //讓adapter的參數給刷新
          adapter.notifyDataSetChanged();
               break;
       }
   }
}

2 則留言: