日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

【Android】 Android中spinner下拉列表的使用

發(fā)布時(shí)間:2024/4/20 Android 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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);??
  • //?建立數(shù)據(jù)源??
  • String[]?mItems?=?getResources().getStringArray(R.array.spinnername);??
  • //?建立Adapter并且綁定數(shù)據(jù)源??
  • ArrayAdapter<String>?_Adapter=new?ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,?mItems);??
  • //綁定?Adapter到控件??
  • 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)?{??
  • ????//?TODO?Auto-generated?method?stub??
  • }??
  • );??
  • ?


    ? ? ? ?(二)使用自定義的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;??
  • ??
  • /**?
  • ?*?自定義適配器類(lèi)?
  • ?*?@author?jiangqq??<a?href=http://blog.csdn.net/jiangqq781931404></a>?
  • ?*?
  • ?*/??
  • 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);??
  • //?建立數(shù)據(jù)源??
  • ???List<Person>??persons=new?ArrayList<Person>();??
  • persons.add(new?Person("張三",?"上海?"));??
  • persons.add(new?Person("李四",?"上海?"));??
  • persons.add(new?Person("王五",?"北京"?));??
  • persons.add(new?Person("趙六",?"廣州?"));??
  • //??建立Adapter綁定數(shù)據(jù)源??
  • MyAdapter?_MyAdapter=new?MyAdapter(this,?persons);??
  • //綁定Adapter??
  • 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;//?要使用的Adapter??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????super.setContentView(R.layout.main);??
  • ????????city?=?(Spinner)?super.findViewById(R.id.city);//?獲取下拉列表??
  • ????????city.setPrompt("您所在的城市是:");//?設(shè)置Prompt??
  • ????????cities?=?ArrayAdapter.createFromResource(this,?R.array.cities,android.R.layout.simple_spinner_item);//?實(shí)例化ArrayAdapter??
  • ????????city.setAdapter(cities);//?設(shè)置顯示信息??
  • ????}??
  • }??

  • ??? 根據(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);//?設(shè)置列表項(xiàng)的顯示風(fēng)格??

  • ??? 之后再次運(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?{??
  • ????//?省略City部分Spinner和ArrayAdapter聲明的代碼??
  • ????private?Spinner?age?=?null;//?聲明一個(gè)Spinner組件,表示年齡??
  • ????private?ArrayAdapter<CharSequence>?ages?=?null;//?聲明一個(gè)ArrayAdapter來(lái)適配年齡??
  • ????private?List<CharSequence>?age_data?=?null;//?聲明一個(gè)放置年齡數(shù)據(jù)的List??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????super.setContentView(R.layout.main);??
  • ????????//?省略City部分的設(shè)置代碼??
  • ????????age?=?new?Spinner(this);//?創(chuàng)建Spinner對(duì)象??
  • ????????age.setPrompt("您的年齡段是:");//?設(shè)置Prompt??
  • ????????age_data?=?Arrays.asList(new?CharSequence[]?{?"10歲以下",?"10-20歲",??
  • ????????????????"20-30歲",?"30-40歲",?"40-50歲",?"50-60歲",?"60歲以上"?});//?設(shè)置年齡段數(shù)組并最終轉(zhuǎn)換為L(zhǎng)ist類(lèi)型??
  • ????????ages?=?new?ArrayAdapter<CharSequence>(this,??
  • ????????????????android.R.layout.simple_spinner_item,?age_data);//?實(shí)例化ArrayAdapter??
  • ????ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//?設(shè)置列表項(xiàng)顯示風(fēng)格??
  • ????????age.setAdapter(ages);//?設(shè)置顯示信息??
  • ????????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ò),歡迎將生活随笔推薦給好友。