Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Widgets——Spinner

Widgets——Spinner

編輯:關於Android編程

Spinner相當於下拉列表,在Android開發文檔中的關於Spinner的介紹:

 

android.widget
類 Spinner

java.lang.Object
  
繼承者 android.view.View 繼承者 android.view.ViewGroup 繼承者 android.widget.AdapterView<SpinnerAdapter> 繼承者 android.widget.AbsSpinner 繼承者 android.widget.Spinner 所有已實現的接口: DialogInterface.OnClickListener,Drawable.Callback,KeyEvent.Callback, ViewManager, ViewParent
A view that displays one child at a time and lets the user pick among them.
The items in the Spinner come from the Adapter associated with this view.
Spinner是一個view,一個每次只能展現一個子元素並且可以讓用戶從它子元素中選擇一個。它的子元素來自之於和這個view綁定的適配器。

 

從官方文檔中我們可以看出,要想使用spinner必須要一個Adapter,它是這個Spinner的數據源。

那我們先建立一個數據源:數據源有兩種形式,1.直接新建一個數組2.在strings.xml中聲明。

我們先在strings.xml中聲明一個數組:

 


    北京
    上海
裡面只有兩個數據,北京和上海。下面是實現代碼:

 

 

String []cities = String []items = getResources().getStringArray(R.array.cities); 
Adapter myAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,cities);
aadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_spinner01.setAdapter(aadapter);
這樣就把這個適配器綁定到了這個spinner上了。下面是監聽:

 

 

sp_spinner01.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView arg0, View arg1,
					int arg2, long arg3) {
				// TODO Auto-generated method stub
				Log.i("abc", "arg1="+arg2+"text="+arg0.getItemAtPosition(arg2).toString());
			}

			@Override
			public void onNothingSelected(AdapterView arg0) {
				// TODO Auto-generated method stub
				Log.i("abc","你什麼都沒選擇");
			}
		});
獲取選擇的內容要用:arg0.getItemAtPosition(arg2),第二參數是選擇的內容所在數組的下標。這樣一個基礎的Spinner就可以運行了,運行結果如下:

 

\

按照慣例,我們一般不會使用系統提供的Spinner,一般都是使用自定義的Spinner,從上面的例子我們可以看出來如果要使用自定義的Spinner,需要有一個Adapter,還有一個layout用於承載每一個Item。Android系統提供的樣式不太好看,我希望每一個Item都有一個圖片還有相應的文字,這樣的話我們可以自己來定義一下:

在layout目錄下新建一個Items.xml

 








這裡包含一個ImageView和一個TextView。

 

最重要的就是我們的Adapter,要從BaseAdapter繼承。

package com.example.widgetstest;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyOwnAdapter extends BaseAdapter {
	
	private ListmyList;
	private Context myContext;
	
	public MyOwnAdapter(ListmyList,Context context) {
		// TODO Auto-generated constructor stub
		this.myList = myList;
		this.myContext = context;
	}
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return myList.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return myList.get(arg0);
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return arg0;
	}

	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {
		// TODO Auto-generated method stub
		LayoutInflater _myInflater = LayoutInflater.from(myContext);
		arg1 = _myInflater.inflate(R.layout.spinner_item, null);
		
		if(arg1 != null){
			TextView content = (TextView)arg1.findViewById(R.id.tv_content);
			content.setText(myList.get(arg0).getItem());
			int imageIcon = R.drawable.ic_launcher;
			switch(arg0){
			    case 0: imageIcon = R.drawable.broadcasting_system_monitor;
			    break;
			    case 1: imageIcon = R.drawable.parking_monitor;
			    break;
			    case 2 : imageIcon = R.drawable.device_alarming;
			    break;
			}
			ImageView icon = (ImageView)arg1.findViewById(R.id.iv_icon);
			icon.setImageResource(imageIcon);
		}
		return arg1;
	}

}
getView方法是這裡最重要的一個方法,重點看一下思路是:通過LayoutInflater的from(Context)方法獲取當前上下文的視圖容器,然後再或許我們自定義的Item樣式的xml文件,獲取後就是可以對其做一些操作。最後將這個設置好的view返回。

 

新建一個Items類內容為:

 

package com.example.widgetstest;

public class Items {
	Items(){}
	
	Items(String items){
		this.item = items;
	}
	private String item;

	public String getItem() {
		return item;
	}

	public void setItem(String item) {
		this.item = item;
	}
	
}
這裡只是一個簡單的演示,如果想要更復雜裡的話,可以自己修改。

 

然後就是在Activity中的調用:

 

Spinner mySpinner = (Spinner)findViewById(R.id.my_spinner);
		List _items = new ArrayList(); 
		_items.add(new Items("報警"));
		_items.add(new Items("停車"));
		_items.add(new Items("廣播"));
		MyOwnAdapter _myAdapter = new MyOwnAdapter(_items,this);
		mySpinner.setAdapter(_myAdapter);
		
		mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView arg0, View arg1,
					int arg2, long arg3) {
				Items t =  (Items) arg0.getItemAtPosition(arg2);	
				Log.i("abc",t.getItem().toString());
			}

			@Override
			public void onNothingSelected(AdapterView arg0) {
				// TODO Auto-generated method stub				
			}
		});
這裡有一點一定要注意,就是getItemAtPosition()的返回值的問題,剛開始的時候我返回的內容使用toString()方法後顯示的是一團序列化的數字而並非我想要的內容查了一下API才發現:

 

 

 public Object getItemAtPosition(int position) {
           T adapter = getAdapter();
           return (adapter == null || position < 0) ? null : adapter.getItem(position);
      }
這個方法其實又調用了我們的adapter裡的getItem方法,再看一下我寫的這個方法的定義:

 

 

public Object getItem(int arg0) {
		return myList.get(arg0);
	}
這裡返回的是myList裡的數據,而我的myList中裝入的數據是:
List _items = new ArrayList(); 
因此這裡返回必然是一個Items對象,因此需要:

 

 

Items t =  (Items) arg0.getItemAtPosition(arg2);
然後調用這個Item對象的get方法才能獲取到這個值。

 

運行結果如下:

\\

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved