生活随笔
收集整理的這篇文章主要介紹了
【Android】 Android中spinner下拉列表的使用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? ?今天學(xué)習(xí)了Spinner組件,使用Spinner相當(dāng)于從下拉列表中選擇項(xiàng)目,下面演示一下Spinner的使用(分別使用ArrayAdapter和自定義Adapter實(shí)現(xiàn))
(一):使用ArrayAdapter進(jìn)行適配數(shù)據(jù):
? ?①:首先定義一個(gè)布局文件:
[html]?view plaincopy
<span?style="font-size:16px;"><?xml?version="1.0"?encoding="utf-8"?>?? <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?? ????android:layout_width="fill_parent"?? ????android:layout_height="fill_parent"?? ????android:orientation="vertical"?>?? ?? ????<Spinner?? ????????android:id="@+id/spinner1"?? ????????android:layout_width="match_parent"?? ????????android:layout_height="wrap_content"?? ??????/>?? </LinearLayout></span>??
[html]?view plaincopy
<span?style="font-size:16px;">??</span>??
? 【注意:】上面的Spinner有兩個(gè)屬性1:prompt是初始的時(shí)候,Spinner顯示的數(shù)據(jù),是一個(gè)引用類(lèi)型 ? 2:entries是直接在xml布局文件中綁定數(shù)據(jù)源(可以不設(shè)置,即可以在Activity中動(dòng)態(tài)綁定)?
? ? ? ? ?②:建立數(shù)據(jù)源,使用數(shù)組,這些數(shù)據(jù)將會(huì)在Spinner下來(lái)列表中進(jìn)行顯示:
[plain]?view plaincopy
<span?style="font-size:16px;"><?xml?version="1.0"?encoding="utf-8"?>?? <resources>?? ????<string-array?name="spinnername">?? ????????<item>北京</item>?? ????????<item>上海?</item>?? ????????<item>廣州</item>?? ????????<item>深圳</item>?? ????</string-array>?? </resources></span>??
? ? ??
? ③:接著在Activity中加入如下的代碼(使用了系統(tǒng)定義的下拉列表的布局文件,當(dāng)然也可以自定義)
[java]?view plaincopy
??????????????? mSpinner?=?(Spinner)?findViewById(R.id.spinner1);?? ?? String[]?mItems?=?getResources().getStringArray(R.array.spinnername);?? ?? ArrayAdapter<String>?_Adapter=new?ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,?mItems);?? ?? mSpinner.setAdapter(_Adapter);??
? ? ? ??
以上代碼初步完成,看下運(yùn)行效果:
?
? ? ? ? ? 下面是關(guān)于Spinner的點(diǎn)擊事件(效果圖如上圖):
[java]?view plaincopy
?????mSpinner.setOnItemSelectedListener(new?OnItemSelectedListener()?{?? @Override?? public?void?onItemSelected(AdapterView<?>?parent,?View?view,?? ????????int?position,?long?id)?{?? ????String?str=parent.getItemAtPosition(position).toString();?? ????Toast.makeText(SpinnerActivity.this,?"你點(diǎn)擊的是:"+str,?2000).show();?? }?? @Override?? public?void?onNothingSelected(AdapterView<?>?parent)?{?? ?????? }?? );??
?
? ? ? ?(二)使用自定義的Adapter(重點(diǎn))
? ? ? ? ? ?①:定義每一個(gè)Item的布局文件
[html]?view plaincopy
<?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"?>?? ?? ????<TextView?? ????????android:id="@+id/textView1"?? ????????android:layout_width="wrap_content"?? ????????android:layout_height="wrap_content"?? ????????android:drawableLeft="@drawable/ic_launcher"?? ????????android:paddingRight="8dip"?? ????????android:paddingTop="8dip"?? ????????android:text="TextView"?? ????????android:textSize="25sp"?/>?? ?? ????<TextView?? ????????android:id="@+id/textView2"?? ????????android:layout_width="wrap_content"?? ????????android:layout_height="wrap_content"?? ????????android:paddingLeft="8dip"?? ????????android:paddingTop="8dip"?? ????????android:text="TextView"?? ????????android:textSize="25sp"?/>?? ?? </LinearLayout>??
? ? ? ? ②:建立Person類(lèi):
??
[java]?view plaincopy
package?com.jiangqq.csdn;?? public?class?Person?{?? ????private?String?personName;?? ????private?String?personAddress;?? ????public?Person(String?personName,?String?personAddress)?{?? ????????super();?? ????????this.personName?=?personName;?? ????????this.personAddress?=?personAddress;?? ????}?? ????public?String?getPersonName()?{?? ????????return?personName;?? ????}?? ????public?void?setPersonName(String?personName)?{?? ????????this.personName?=?personName;?? ????}?? ????public?String?getPersonAddress()?{?? ????????return?personAddress;?? ????}?? ????public?void?setPersonAddress(String?personAddress)?{?? ????????this.personAddress?=?personAddress;?? ????}?? ?? }??
? ? ? ?③:創(chuàng)建MyAdapter繼承與BaseAdapter,進(jìn)行適配:
? ??
[java]?view plaincopy
package?com.jiangqq.csdn;?? ?? 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.TextView;?? ?? ? ? ? ? ?? public?class?MyAdapter?extends?BaseAdapter?{?? ????private?List<Person>?mList;?? ????private?Context?mContext;?? ?? ????public?MyAdapter(Context?pContext,?List<Person>?pList)?{?? ????????this.mContext?=?pContext;?? ????????this.mList?=?pList;?? ????}?? ?? ????@Override?? ????public?int?getCount()?{?? ????????return?mList.size();?? ????}?? ?? ????@Override?? ????public?Object?getItem(int?position)?{?? ????????return?mList.get(position);?? ????}?? ?? ????@Override?? ????public?long?getItemId(int?position)?{?? ????????return?position;?? ????}?? ????? ? ?? ????@Override?? ????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{?? ????????LayoutInflater?_LayoutInflater=LayoutInflater.from(mContext);?? ????????convertView=_LayoutInflater.inflate(R.layout.item,?null);?? ????????if(convertView!=null)?? ????????{?? ????????????TextView?_TextView1=(TextView)convertView.findViewById(R.id.textView1);?? ????????????TextView?_TextView2=(TextView)convertView.findViewById(R.id.textView2);?? ????????????_TextView1.setText(mList.get(position).getPersonName());?? ????????????_TextView2.setText(mList.get(position).getPersonAddress());?? ????????}?? ????????return?convertView;?? ????}?? }??
?④:在Activity中加入如下代碼:
? ?
[java]?view plaincopy
?????????????????? mSpinner?=?(Spinner)?findViewById(R.id.spinner1);?? ?? ???List<Person>??persons=new?ArrayList<Person>();?? persons.add(new?Person("張三",?"上海?"));?? persons.add(new?Person("李四",?"上海?"));?? persons.add(new?Person("王五",?"北京"?));?? persons.add(new?Person("趙六",?"廣州?"));?? ?? MyAdapter?_MyAdapter=new?MyAdapter(this,?persons);?? ?? mSpinner.setAdapter(_MyAdapter);??
? 運(yùn)行效果如下截圖:
??
? ??? 監(jiān)聽(tīng)事件和第一種方法相同:
方式二:
? ? 在Web開(kāi)發(fā)中,HTML提供了下拉列表的實(shí)現(xiàn),就是使用<select>元素實(shí)現(xiàn)一個(gè)下拉列表,在其中每個(gè)下拉列表項(xiàng)使用<option>表示即可。這是在Web開(kāi)發(fā)中一個(gè)必不可少的交互性組件,在Android中的對(duì)應(yīng)實(shí)現(xiàn)就是Spinner。
??? 首先來(lái)看一下Spinner的文檔:?
?
java.lang.Object?
?? ? android.view.View?
?? ? android.view.ViewGroup?
?? ? android.widget.AdapterView<T extends android.widget.Adapter>?
?? ? android.widget.AbsSpinner?
?? ? android.widget.Spinner?
??? Spinner的繼承結(jié)構(gòu)比較復(fù)雜,在繼承樹(shù)中有AdapterView,這是比較重要的一項(xiàng),因?yàn)槲覀兙褪峭ㄟ^(guò)Adapter來(lái)為Spinner設(shè)置下拉列表項(xiàng)的。?
??? Spinner的重點(diǎn)問(wèn)題就是下拉列表項(xiàng)的配置,通過(guò)之前組件的了解,我們知道資源組件的配置有兩種方式,一種是通過(guò)XML文件來(lái)配置,一種是通過(guò)程序來(lái)配置。而從Spinner的文檔中,我們可以看到,對(duì)它的配置需要使用Adapter類(lèi)的實(shí)現(xiàn)。?
??? 下面我們就來(lái)看看Spinner的使用,在Eclipse中創(chuàng)建SpinnerDemo項(xiàng)目,編寫(xiě)代碼:?
Xml代碼??
<TextView?? ????android:id="@+id/degreeLabel"?? ????android:layout_width="fill_parent"?? ????android:layout_height="wrap_content"?? ????android:text="請(qǐng)選擇您的學(xué)歷"?/>?? <Spinner?? ????android:id="@+id/degree"?? ????android:layout_width="fill_parent"?? ????android:layout_height="wrap_content"?/>??
??? 這里放置了一個(gè)空的Spinner,直接運(yùn)行程序,我們看到如下效果:?
?
??? 就是一個(gè)空的下拉框,什么都沒(méi)有,下面我們開(kāi)始向這個(gè)下拉框中設(shè)置列表項(xiàng)。首先我們使用XML資源文件的配置方式,在values目錄下創(chuàng)建spinner_data.xml,并設(shè)置如下內(nèi)容:?
Xml代碼??
<string-array?name="degrees">?? ????<item>初中及以下</item>?? ????<item>高中</item>?? ????<item>大學(xué)</item>?? ????<item>研究生及以上</item>?? </string-array>??
??? 不難理解<string-array>表示字符串的數(shù)組,就是可以定義多個(gè)字符串的項(xiàng)目,在其中,我們?nèi)匀皇褂?lt;item>來(lái)定義每一項(xiàng),設(shè)置好后,將其應(yīng)用到Spinner中:?
Xml代碼??
<Spinner?? ????android:id="@+id/degree"?? ????android:layout_width="fill_parent"?? ????android:layout_height="wrap_content"?? ????android:entries="@array/degrees"?/>??
??? 配置Spinner組件中的entries屬性即可引用我們?cè)趕pinner_data.xml中定義的degrees項(xiàng)目組了,不難想到,它已經(jīng)被注冊(cè)到R.java中了。運(yùn)行程序,我們得到如下顯示效果:?
?
??? 這里可以看到,我們雖然設(shè)置了提示信息,但是點(diǎn)擊下拉框后并沒(méi)有出現(xiàn)Spinner的提示,而是直接顯示出了我們?cè)O(shè)置的選項(xiàng),這樣的顯示并不是很好看,我們希望在彈出的Spinner選擇框上也給出提示,那么我們可以這么來(lái)設(shè)置:?
Xml代碼??
<Spinner?? ????android:id="@+id/degree"?? ????android:layout_width="fill_parent"?? ????android:layout_height="wrap_content"?? ????android:entries="@array/degrees"?? ????android:prompt="@string/degrees_prompt"?/>??
??? 也就是在Spinner組件中加上prompt屬性即可,注意這里不能直接使用文本了,而需要使用引用,那么我們?cè)趕trings.xml中加入如下信息:?
Xml代碼??
<string?name="degrees_prompt">您的學(xué)歷是:</string>??
?? 我們?cè)俅芜\(yùn)行程序,就可以看到如下的效果:?
?
??? 這次再點(diǎn)擊Spinner,彈出的下拉框中就有了提示的prompt,顯示效果好了很多。?
??? 下面我們看看如何通過(guò)程序來(lái)控制Spinner和列表項(xiàng),之前說(shuō)過(guò)要使用程序,就要用到Adapter類(lèi),這里我們使用實(shí)現(xiàn)類(lèi)ArrayAdapter來(lái)進(jìn)行操作。首先我們使用ArrayAdapter讀取XML配置文件的方式來(lái)說(shuō)明:?
Xml代碼??
<string-array?name="cities">?? ????<item>北京</item>?? ????<item>上海</item>?? ????<item>大連</item>?? </string-array>??
??? 我們?cè)趕pinner_data.xml中再設(shè)置一組值來(lái)表示城市,有了列表項(xiàng),我們還需要再創(chuàng)建一個(gè)Spinner,那么在main.xml中,再設(shè)置一個(gè)Spinner:?
Xml代碼??
<TextView?? ????android:id="@+id/cityLabel"?? ????android:layout_width="fill_parent"?? ????android:layout_height="wrap_content"?? ????android:text="請(qǐng)選擇您所在的城市"?/>?? <Spinner?? ????android:id="@+id/city"?? ????android:layout_width="fill_parent"?? ????android:layout_height="wrap_content"?/>??
??? 那么在Activity程序中,我們可以如下來(lái)編寫(xiě)代碼:?
Java代碼??
package?org.ourpioneer;?? import?android.app.Activity;?? import?android.os.Bundle;?? import?android.widget.ArrayAdapter;?? import?android.widget.Spinner;?? public?class?SpinnerDemoActivity?extends?Activity?{?? ????private?Spinner?city?=?null;?? ????private?ArrayAdapter<CharSequence>?cities?=?null;?? ????public?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????super.setContentView(R.layout.main);?? ????????city?=?(Spinner)?super.findViewById(R.id.city);?? ????????city.setPrompt("您所在的城市是:");?? ????????cities?=?ArrayAdapter.createFromResource(this,?R.array.cities,android.R.layout.simple_spinner_item);?? ????????city.setAdapter(cities);?? ????}?? }??
??? 根據(jù)代碼中的注釋,不難理解每行代碼的意思,這和在XML中配置Spinner是類(lèi)似的。要多說(shuō)的一點(diǎn)就是這里我們?yōu)锳rrayAdapter設(shè)置的泛型是CharSequence,而不是直接使用String,這是出于以后對(duì)StringBuffer的兼容,來(lái)看下CharSequence的文檔:?
?
??? 不難看出,String和StringBuffer都是CharSequence的子類(lèi),這里定義為CharSequence后直接使用字符串格式是沒(méi)有問(wèn)題的。?
??? 下面直接運(yùn)行程序,我們可以看到如下效果:?
?
??? 此時(shí)列表項(xiàng)的顯示和之前的不同,是因?yàn)槲覀冊(cè)趯?shí)例化ArrayAdapter時(shí)使用了android.R.layout.simple_spinner_item,也就是使用了簡(jiǎn)單的spinner項(xiàng)。?
??? 可以通過(guò)如下的代碼控制顯示風(fēng)格:?
Java代碼??
cities.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);??
??? 之后再次運(yùn)行代碼,就可以看到和之前一樣的顯示效果了。?
??? 下面來(lái)看第二種ArrayAdapter的使用方式,就是在程序中動(dòng)態(tài)生成結(jié)果來(lái)進(jìn)行填充,我們修改上面的代碼,最終為:?
Java代碼??
package?org.ourpioneer;?? import?java.util.Arrays;?? import?java.util.List;?? import?android.app.Activity;?? import?android.os.Bundle;?? import?android.widget.ArrayAdapter;?? import?android.widget.LinearLayout;?? import?android.widget.Spinner;?? import?android.widget.TextView;?? ?? public?class?SpinnerDemoActivity?extends?Activity?{?? ?????? ????private?Spinner?age?=?null;?? ????private?ArrayAdapter<CharSequence>?ages?=?null;?? ????private?List<CharSequence>?age_data?=?null;?? ????public?void?onCreate(Bundle?savedInstanceState)?{?? ????????super.onCreate(savedInstanceState);?? ????????super.setContentView(R.layout.main);?? ?????????? ????????age?=?new?Spinner(this);?? ????????age.setPrompt("您的年齡段是:");?? ????????age_data?=?Arrays.asList(new?CharSequence[]?{?"10歲以下",?"10-20歲",?? ????????????????"20-30歲",?"30-40歲",?"40-50歲",?"50-60歲",?"60歲以上"?});?? ????????ages?=?new?ArrayAdapter<CharSequence>(this,?? ????????????????android.R.layout.simple_spinner_item,?age_data);?? ????ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);?? ????????age.setAdapter(ages);?? ????????LinearLayout?layout?=?(LinearLayout)?super.findViewById(R.id.layout);?? ????????TextView?ageLabel=new?TextView(this);?? ????????ageLabel.setText("請(qǐng)選擇您的年齡段");?? ????????layout.addView(ageLabel);?? ????????layout.addView(age);?? ????}?? }??
??? 在此之前,不要忘了在main.xml中為我們的布局管理器加上ID屬性,這樣才能在程序中進(jìn)行調(diào)用,運(yùn)行程序,我們可以看到如下效果:?
?
??? 點(diǎn)擊即可彈出下拉列表框顯示具體內(nèi)容了。?
??? 下面我們?cè)贏ndroid設(shè)備上來(lái)運(yùn)行Spinner的示例程序,運(yùn)行環(huán)境為Motorola Defy+ 2.3.7 MIUI,所得到的具體顯示效果為:?
?
??? 可以看出,這和我們?cè)谀M器中的顯示效果略有不同,那么就是手機(jī)所刷ROM對(duì)我們組件顯示風(fēng)格的影響了,也就是說(shuō),在不同的ROM下,會(huì)有不同的顯示效果。?
參考網(wǎng)址:http://sarin.iteye.com/blog/1669773
總結(jié)
以上是生活随笔為你收集整理的【Android】 Android中spinner下拉列表的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。