官术网_书友最值得收藏!

3.3 適配視圖基礎(chǔ)

本節(jié)介紹適配器的基本概念,結(jié)合對下拉框Spinner的使用說明分別闡述數(shù)組適配器ArrayAdapter、簡單適配器SimpleAdapter的具體用法與展示效果。

3.3.1 下拉框Spinner

Spinner是下拉框,用于從一串列表中選擇某項(xiàng),功能類似于單選按鈕的組合。下拉列表的展示方式有兩種,一種是在當(dāng)前下拉框的正下方展示列表,此時(shí)把spinnerMode屬性設(shè)置為dropdown;另一種是在頁面中部以對話框形式展示列表,此時(shí)把spinnerMode屬性設(shè)置為dialog。另外,Spinner還可以在代碼中調(diào)用下列4個(gè)方法。

● setPrompt:設(shè)置標(biāo)題文字。

● setAdapter:設(shè)置下拉列表的適配器。適配器可選擇ArrayAdapter或SimpleAdapter。

● setSelection:設(shè)置當(dāng)前選中哪項(xiàng)。注意該方法要在setAdapter方法后調(diào)用。

● setOnItemSelectedListener:設(shè)置下拉列表的選中監(jiān)聽器,該監(jiān)聽器要實(shí)現(xiàn)接口OnItemSelectedListener。

下面是一個(gè)自定義選中監(jiān)聽器的例子:

            private String[] starArray = {"水星", "金星", "地球", "火星", "木星", "土星"};
            private class MySelectedListener implements OnItemSelectedListener {
                public void onItemSelected(AdapterView<? > arg0, View arg1, int arg2, long arg3) {
                    Toast.makeText(SpinnerDialogActivity.this, "您選擇的是"+starArray[arg2],
    Toast.LENGTH_LONG).show();
                }


                public void onNothingSelected(AdapterView<? > arg0) {
                }
            }

下面是使用Spinner控件的代碼片段:

                ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this,
                        R.layout.item_select, starArray);
                starAdapter.setDropDownViewResource(R.layout.item_dropdown);
                Spinner sp = (Spinner) findViewById(R.id.sp_dialog);
                sp.setPrompt("請選擇行星");
                sp.setAdapter(starAdapter);
                sp.setSelection(0);
                sp.setOnItemSelectedListener(new MySelectedListener());

接下來看對話框模式的下拉效果,如圖3-11所示。頁面中部彈出六大行星的下拉列表;點(diǎn)擊具體行星項(xiàng)后自動(dòng)收起下拉列表,并且下拉框中的文字變更為剛選中的行星名稱。

圖3-11 dialog模式的下拉列表

3.3.2 數(shù)組適配器ArrayAdapter

前面在演示Spinner時(shí)用到了setAdapter方法設(shè)置適配器。這個(gè)適配器好比一組數(shù)據(jù)的加工流水線,你丟給它一大把糖果,適配器把糖果排列好順序,然后拿來制作好的包裝盒,把糖果往里面一塞,出來的便是一個(gè)個(gè)精美的糖果盒。這個(gè)流水線可以做得很復(fù)雜,也可以做得簡單一些,最簡單的流水線就是之前演示Spinner用到的ArrayAdapter。

ArrayAdapter主要用于每行列表只展示文本的情況,有兩道工序,第一道工序是構(gòu)造函數(shù),除了提供一堆原始數(shù)據(jù)外(六大行星的名稱列表),還可以指定下拉框當(dāng)前文本的包裝盒,即下面這行代碼里的R.layout.item_select,這個(gè)布局文件內(nèi)只有一個(gè)TextView,定義了當(dāng)前選中文本的大小、顏色、對齊方式等屬性。

                ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this,
                        R.layout.item_select, starArray);

第二道工序是定義下拉列表的包裝盒,即下面代碼里的R.layout.item_dropdown,定義了對話框列表中每行文本的顯示屬性。

                starAdapter.setDropDownViewResource(R.layout.item_dropdown);

經(jīng)過這兩道工序,ArrayAdapter就明確了原料糖果的分揀過程與包裝方式,接下來只待Spinner調(diào)用setAdapter方法發(fā)出開動(dòng)機(jī)器指令,適配器便會(huì)把一個(gè)一個(gè)糖果盒輸出到屏幕界面。

3.3.3 簡單適配器SimpleAdapter

ArrayAdapter只能顯示文本列表,顯然不夠美觀,有時(shí)我們還想給列表加上圖標(biāo),比如六大行星是否分別顯示星球的小圖。這時(shí)SimpleAdapter就派上用場了,它允許在列表項(xiàng)中展示多個(gè)控件,包括文本與圖片。

SimpleAdapter的實(shí)現(xiàn)略微復(fù)雜,除了第二道工序與ArrayAdapter一樣外,第一道工序需要更多信息。例如,原料不但有糖果,還有賀卡,這樣就得把一大袋糖果和一大袋賀卡送進(jìn)流水線,適配器每次拿一顆糖果和一張賀卡,把糖果與賀卡按規(guī)定塞進(jìn)包裝盒。對于SimpleAdapter的構(gòu)造函數(shù)來說,第二個(gè)參數(shù)Map容器放的是原料糖果與賀卡,第3個(gè)參數(shù)放的是包裝盒,第4個(gè)參數(shù)放的是糖果袋與賀卡袋的名稱,第5個(gè)參數(shù)放的是包裝盒里塞糖果的位置與塞賀卡的位置。

下面是使用SimpleAdapter的示例代碼:

                int[] iconArray = {R.drawable.shuixing, R.drawable.jinxing, R.drawable.diqiu,
                    R.drawable.huoxing, R.drawable.muxing, R.drawable.tuxing };
                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                for (int i = 0; i < iconArray.length; i++) {
                    Map<String, Object> item = new HashMap<String, Object>();
                    item.put("icon", iconArray[i]);
                    item.put("name", starArray[i]);
                    list.add(item);
                }
                SimpleAdapter starAdapter = new SimpleAdapter(this, list, R.layout.item_select,
                        new String[] { "icon", "name" }, new int[] { R.id.iv_icon, R.id.tv_name });
                starAdapter.setDropDownViewResource(R.layout.item_simple);

下面是每個(gè)列表項(xiàng)的布局文件代碼(包裝盒):

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">


            <ImageView
                android:id="@+id/iv_icon"
                android:layout_width="0dp"
                android:layout_height="50dp"
                android:layout_weight="1"
                android:gravity="center"/>


            <TextView
                android:id="@+id/tv_name"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="3"
                android:gravity="center"
                android:textSize="17sp"
                android:textColor="#ff0000"/>
        </LinearLayout>

敲了這么多代碼,下面看一下加了圖標(biāo)的下拉列表的效果圖,如圖3-12所示。此時(shí)下拉列表左邊顯示行星的圖片,右邊顯示行星的名稱。

圖3-12 帶圖標(biāo)的下拉列表

主站蜘蛛池模板: 巴彦县| 新巴尔虎左旗| 广灵县| 宝丰县| 施秉县| 永川市| 铁岭市| 石城县| 广州市| 镇安县| 嘉兴市| 商南县| 军事| 环江| 和田县| 图片| 连江县| 灌南县| 乌审旗| 绩溪县| 青浦区| 华阴市| 榕江县| 桦川县| 海安县| 巍山| 时尚| 屏山县| 贡觉县| 鹤壁市| 铜陵市| 南宁市| 汤阴县| 山东| 五指山市| 保靖县| 洪泽县| 申扎县| 成安县| 拜泉县| 尚志市|