編輯:關於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); ArrayAdapteradapter = 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 = { "孫悟空", "豬八戒", "沙和尚" ,"白骨精"}; ArrayAdapteradapter1 = 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
顯示復雜列表
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); ArrayAdapteradapter = new ArrayAdapter (MainActivity.this, android.R.layout.simple_spinner_item, data); s.setAdapter(adapter);
ArrayAdapteradapter = 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; } };
關鍵點 canvas.drawBitmap(bitmap, srcRect, dstRect, null); 將bitmap的srcRect區域繪制到canva
本文講述了Android使用國內鏡像在線更新SDK的方法。分享給大家供大家參考,具體如下:什麼是Android SDK:SDK:(software development
平時項目中經常用到自定義進度條樣式,我們一般實現的也是下面的第一種,至於第二種的圓角進度,網上介紹的資料也不是很多,這裡一起展示一下這兩種的實現。下面開始看代碼,先從主界
在前面的博文中,小編簡單的介紹了如何制作圓角的按鈕以及圓角的圖片,伴著鍵盤和手指之間的舞步,迎來新的問題,不知道小伙伴有沒有這樣的經歷,以App為例,點擊頭像的時候,會從