Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 跟我學Android之十一 列表和適配器

跟我學Android之十一 列表和適配器

編輯:關於Android編程

本章內容

第1節 列表類視圖概述

第2節 列表視圖ListView

第3節 下拉視圖Spinner

本章目標

 

 

理解MVC模式的設計思想。

了解AdapterView 的繼承關系圖。

掌握掌握使用各類適配器顯示列表數據。

掌握列表視圖ListView的用法。

掌握下拉視圖Spinner的用法。

 

列表控件是界面設計中一種常用的控件

u主要用於展現一系列數據項供用戶選擇或浏覽,比如:

?收件箱中的郵件標題列表

?通訊錄中的聯系人列表

?注冊用戶時的城市選擇列表

uAndroid系統中提供了多種形式的列表展現

?單選列表

?多選列表

?可展開列表

Android列表采用了MVC的設計模式

u用戶前端界面與後端的數據分離

uMVC設計模式的思想如下

?視圖模塊負責顯示用戶界面和響應用戶動作

?模型模塊負責管理維護數據

?控制器負責執行業務邏輯

 

\

 

AdapterView具有如下特征。

uAdapterView繼承了 ViewGroup,它的本質是容器。

uAdapterView可以包括多個“列表顼”,並將多個“列表項”以合適的形式示出來。

uAdapterView顯示的多個“列表項”由Adapter提供。調用AdapterView的setAdapter(Adapter)方法設置 Adapter即可。

 

\

 

常用列表視圖

ListView(列表視圖)

Spinner(下拉視圖)

GridView(網格視圖)

ExpandableListView(可展開的列表組件)

 

適配器在列表控件中的用途

u適配器就是列表控件的模型

?為列表控件提供數據

?為列表項提供了顯示視圖

 

\

 

適配器的基類是android.widget.Adapter

u定義了數據提供者的標准

u提供了很多子類實現了多種數據的提供手段,常用的實現類如下

?ArrayAdapter:簡單、易用的Adapter.通常用於將數組或List集合的多個值包裝成多個列表項。

?SimpleAdapter:並不簡單、功能強大的Adapter。可用於將List集合的多個對象包裝成多個列表項。

?BaseAdapter通常用於被擴展。擴展BaseAdapter可以對各列表項進行最大限度的定制。

 

\

 

ListView控件用於以列表形式顯示數據

uListView采用MVC模式將前端顯示和後端數據進行了分離

?ListView裝載數據時並不使用ListView本身的方法

?通過指定一個Adapter對象給ListView提供數據

uListView顯示效果如下

 

\

 

與列表相關的主要事件有兩個

uItemSelected(列表項被選中時發生)

?通過列表控件的setOnItemSelectedListener()實現監聽

uItemClick(單擊列表項時發生)

?通過列表控件的setOnItemClickListener()實現監聽

uItemLongClick(長按列表項時發生)

?通過列表控件的setOnItemLongClickListener()實現監聽

使用數組作為數據源

 

\

 

ArrayAdapter通過數組為列表控件提供數據,構造ArrayAdapter的對象

String [] data = getResources().getStringArray(R.array.data);
ArrayAdapter adapter = 
        new ArrayAdapter(MainActivity.this,  
                android.R.layout.simple_list_item_1, data);

?第二個參數表示為列表控件提供列表項的顯示視圖

?第三個參數即為適配器所需要的數組數據

u使用ArrayAdapter對象作為列表控件的數據源

 

ListView lv = (ListView)findViewById(R.id.listview);
lv.setAdapter(adapter);

\

 

*設置可多選的ListView
final String[] arr1 = { "孫悟空", "豬八戒", "沙和尚" ,"白骨精"};
ArrayAdapter adapter1 = new ArrayAdapter
		 (this, android.R.layout.simple_list_item_multiple_choice, arr1);
list1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
		// 為ListView設置Adapter
		list1.setAdapter(adapter1);

 

 

\

 

SimpleAdapter概述

SimpleAdapter可以用於顯示復雜數據

uSimpleAdapter可以在列表的一項中提供和顯示多個數據

uSimpleAdapter需要自定義數據結構和顯示視圖布局

uSimpleAdapter的構造需要5個參數

?context:為使用SimpleAdapter的上下文

?data:為用於顯示的具體數據

l這是一個map對象的list,list中的每一項是一個map

lmap中的每一項對應著列表項顯示視圖中的一個內容

?resource:用於顯示具體數據的布局資源

?from:data數據中map所包含的每一個項中key的名字的數組

?to:map中的每一個key的內容所對應的顯示視圖的資源id的數組

使用SimpleAdapter顯示復雜數據需要設計好數據內容

u不過視圖如何復雜,列表的每一項內容由多個數據字段構成

u在提供數據的時候,需要為每一個數據字段設計一個名字

?字段名字和具體數據構成鍵值對,存放在map對象中

List> listItems = 
				new ArrayList>();
for (int i = 0; i < names.length; i++)
{
Map listItem = new HashMap();
	listItem.put("header", imageIds[i]);
	listItem.put("personName", names[i]);
	listItem.put("desc", descs[i]);
	listItems.add(listItem);
}

顯示復雜列表

u首先需要為復雜數據結構定義用於顯示的列表項布局

?布局文件:R.layout.simple_item

?該文件包含一個頭像ImageView,名字TextView,簡介TextView

 

\

 

顯示復雜列表,然後在ListView中使用SimpleAdapter

 

SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
			R.layout.simple_item, 
			new String[] { "personName", "header" , "desc"},
			new int[] { R.id.name, R.id.header , R.id.desc });
ListView list = (ListView) findViewById(R.id.mylist);
// 為ListView設置Adapter
list.setAdapter(simpleAdapter);

系統內置列表項

Android為列表控件提了一些基本的列表項布局

u布局基本都在android.R.layout中

?android.R.layout.simple_list_item_1

?android.R.layout.simple_list_item_2

?android.R.layout.simple_list_item_checked

?android.R.layout.simple_list_item_multiple_choice

?android.R.layout.simple_list_item_single_choice

列表項的常見規劃設計

u在實際應用中,列表項顯示設計往往是多種多樣的

u一些常見的設計效果如下:

 

\

 

創建自定義適配器

u編寫自定義適配器,選擇繼承android.widget.BaseAdapter

u通常為適配器關聯一個list,用於數據的提供

u覆蓋public int getCount()方法,用於告知列表有多少項數據

public int getCount() {
return dataList.size();
}

u覆蓋getView()方法,用於向列表提供列表項的顯示視圖

View getView (int position, View convertView, ViewGroup parent)

?列表項視圖通常有兩種方法

l通過布局資源定義,然後采用動態加載的方法使用

l通過程序實現布局

創建自定義適配器,

getView()方法覆蓋示例

public View getView(int position, View convertView, ViewGroup parent) {
        String ns = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater li = (LayoutInflater)context.getSystemService(ns);
        View layout = li.inflate(R.layout.simple_item, null);

        TextView titleView = (TextView)layout.findViewById(R.id.title);
        TextView bodyView = (TextView)layout.findViewById(R.id.body);
        Mail m = dataList.get(position);
        titleView.setText(m.getTitle());
        bodyView.setText(m.getMessage());
       return layout;
}
使用自定義適配器實現動態顯示數據 u所謂動態顯示就是在運行過程中通過程序增刪改列表項 u在自定義適配器中添加增刪改數據的方法 ?在改變數據完成後一定要通知視圖
public void addMail(Mail m) {
        dataList.add(m);
        notifyDataSetChanged();
}

Spinner控件用於顯示一個下拉列表

uSpinner采用MVC模式將前端顯示和後端數據進行了分離

?Spinner裝載數據時並不使用Spinner本身的方法

?通過指定一個Adapter對象給Spinner提供數據

uSpinner顯示效果如下

 

\

 

創建Spinner

uSpinner相當於Android系統中的combobox(下拉選擇框)

uSpinner同樣使用Adapter提供數據顯示

u在布局中使用標簽布局

u在Activity中獲取Spinner對象

Spinner spinner = (Spinner)findViewById(R.id.spinner);

利用Spinner顯示數據

u在資源中准備要顯示的數據數組

獅子王

叢林大冒險

米老鼠和唐老鴨

黑貓警長

u通過ArrayAdapter給Spinner提供數據顯示

 
String [] data = getResources().getStringArray(R.array.moviearray);
ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, 
        android.R.layout.simple_spinner_item, data);
s.setAdapter(adapter);

實現帶圖片的Spinner u需要自定義Spinner的列表項視圖 u使用自定義列表項視圖的辦法有多種 ?通過自定義適配器來使用 ?通過繼承ArrayAdapter,覆蓋getDropDownView()方法 實現帶圖片的Spinner,通過覆蓋getDropDownView()方法實現自定義視圖
ArrayAdapter adapter = 
        new ArrayAdapter(this, android.R.layout.spinner_item, p) {
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
                View view = getLayoutInflater().inflate(R.layout.spinner_item, parent, false);
                TextView label = (TextView) view.findViewById(R.id.label);
                label.setText(getItem(position));
                if (spinner.getSelectedItemPosition() == position) {
                        label.setTextColor(getResources().getColor(R.color.selected_fg));
                        view.setBackgroundColor(getResources().getColor(R.color.selected_bg));
                        view.findViewById(R.id.icon).setVisibility(View.VISIBLE);
                }
                return view;
        }
};

後一定要通知視圖
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved