編輯:關於Android編程
Spinner相當於下拉列表,在Android開發文檔中的關於Spinner的介紹:
java.lang.Objectandroid.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這樣就把這個適配器綁定到了這個spinner上了。下面是監聽:myAdapter = new ArrayAdapter (this,android.R.layout.simple_spinner_item,cities); aadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); sp_spinner01.setAdapter(aadapter);
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
最重要的就是我們的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 ListgetView方法是這裡最重要的一個方法,重點看一下思路是:通過LayoutInflater的from(Context)方法獲取當前上下文的視圖容器,然後再或許我們自定義的Item樣式的xml文件,獲取後就是可以對其做一些操作。最後將這個設置好的view返回。myList; private Context myContext; public MyOwnAdapter(List myList,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; } }
新建一個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這裡有一點一定要注意,就是getItemAtPosition()的返回值的問題,剛開始的時候我返回的內容使用toString()方法後顯示的是一團序列化的數字而並非我想要的內容查了一下API才發現:_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 } });
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對象,因此需要:_items = new ArrayList ();
Items t = (Items) arg0.getItemAtPosition(arg2);然後調用這個Item對象的get方法才能獲取到這個值。
運行結果如下:
一、前言在之前的一篇文章中我們已經詳細介紹了Android中Hook工作的一款神器Xposed工具:Xposed框架原理解析和使用案例分析 在那一篇文章中我們介紹了如何安
Android 確實是不允許在子線程中進行UI 操作。但有些時候,我們必須在子線程裡去執行一些耗時任務,然後根據任務的執行結果來更新相應的UI 控件,這該如何是好呢?對於
隨著Android應用增多,功能越來越復雜,布局也越來越豐富了,而這些也成為了阻礙一個應用流暢運行,因此,對復雜的功能進行性能優化是創造高質量應用的基礎,本
Android提供了 VideoView組件,它的作用與ImageView類似,只是ImageView用於顯示圖片,而VideoView用於播放視頻。 使用