1. 程式人生 > >Android之AdapterView及其子類的介紹

Android之AdapterView及其子類的介紹

Apater是介面卡
AdapterView 顯示一堆資料
—AbsListView
—-ListView,GridView
—AbsSpinner
—-Gallery,Spinner
ListView
—ExpandableListView

AdapterView具有的特點:
a)繼承了ViewGroup
b)可以包括多個列表項,並將多個列
表項以合適的形式顯示出來。
c)顯示多個列表項,由Adapter提供。
呼叫AdapterView的setAdapter(Adapter)
方法設定Adapter即可。

I)ListView的實現第一種方式:繼承Activity
1)在佈局檔案中配置ListView的屬性。
android:entries=”@array/courses”:設定顯示陣列資料,
android:divider=”#ff0000”:設定每項的分割條
android:dividerHeight=”2dp”:設定分割條的高度
android:listSelector=”@drawable/list_selector”
設定每一個列表項被點選時顯示不同的樣式
如果listSelector沒有效果加上
android:cacheColorHint=”#00000000”

   其新增setOnItemClickListener(OnItemClickListener)事件
         setOnItemLongClickListener(OnItemLongClickListener)事件

總結:使用陣列建立ListView十分簡單。
但這種方式能定製的內容很少,資料不靈活。
甚至連每個列表項的字號大小,顏色都不能改變。
如果想對ListView的外觀,行為進行定製,
需要把ListView作為AdapterView使用,
通過Adapter控制每項的外觀和行為。

2)Adapter是一個介面,
為列表項提供資料和佈局檔案。
常見了Adapter有:
ArrayAdapter:簡單,易用的Adapter,通常用於將陣列或List集合的多個值包裝成多個列表項
SimpleAdapter:並不簡單,功能強大的Adapter,可以用於將List集合的多個物件包裝成多個列表項
SimpleCursorAdapter:與SimpleAdapter相似,只是用於包裝Cursor提供的資料
BaseAdapter:通常用於被擴充套件,可以對各列表項進行最大限度的定製

3)在佈局檔案中配置ListView使用
ArrayAdapter為其新增顯示資料、 配置不同佈局方式。

下面的佈局都是Android系統自帶的:android.R.layout
simple_list_item_1:每項顯示一個內容時

simple_list_item_single_choice:帶有單選框的佈局形式
需要結合ListView中的setChoiceMode(ListView.CHOICE_MODE_SINGLE);

simple_list_item_multiple_choice:帶有多選框的佈局形式
需要結合ListView中的setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

simple_list_item_checked:帶有選擇框的佈局形式
也需要結合ListView中的setChoiceMode

總結:這種方式能夠指定靈活的資料,
但是介面比較單一,
每個列表項都是TextView元件。
也 可以自定義佈局檔案,
並且提供一個TextView元件.

4)SimpleAdapter,在佈局檔案中配置ListView

使用SimpleAdapter為其新增顯示資料、實現自定義佈局

SimpleAdapter(Context context, List<? extends Map<String, ?>> data,int resource, String[] from, int[] to)

第一個引數是Context,android上下文
第二個引數是List<? extends Map<String,?>>
型別的集合物件,該集合中每個Map<String,?>
物件生成一個列表項
第三個引數是指定一個介面佈局的ID。 使用該介面作為列表項元件
第四個引數是一個String[]型別的引數,該引數決定提取Map<String,?>
物件中哪些key對應的value來生成列表項
第五個引數是一個int[]型別的引數,
該引數決定填充哪些元件.在第三個
引數的佈局檔案中找元件。

總結:功能強大,可以實現更復
雜的列表項。資料複雜。
但是隻能顯示本地圖片,
不能線上更新資料(如多個檔案的下載進度)。

5)自定義Adapter介面卡:

常用的方式
extends BaseAdapter
BaseAdapter是所有介面卡的基類

BaseAdapter是抽象類

根據專案的情況提供自己需要的構造器
public MyAdapter(Context context,List list){
}
返回ListView中要顯示的子View數量
//只需要返回構造方法中的list的條目就可以了
@Override
public int getCount() {
return this.list!=null?this.list.size():0;
}

返回一個子View,即ListView中的一個子條目顯示資料的物件。
//也可以自定義返回你想要的資訊

public Object getItem(int position) {
return this.list.get(position);
}

根據介面卡的位置返回顯示在ListVIew的位置

public long getItemId(int position) {
return position;
}

返回這個條目的整個資訊

public View getView(int position, View convertView, ViewGroup parent) return convertView;
})

6)ListView的實現另外一種方式:
繼承ListActivity
繼承Activity
a)ListActivity預設佈局中具有ListView,
就可以不用指定佈局檔案。
然後呼叫setListAdapter為其指定介面卡

b)也可以自定義佈局方式,
需要手動在佈局檔案中新增id為
@android:id/list的ListView控制元件
然後呼叫setListAdapter為其指定介面卡
顯示兩個文字框的佈局當ListView中的資料為空時,
顯示其他的元件,
如下例:
指定該元件的id號為@android:id/empty

 <TextView  
    android:id="@android:id/empty"
        android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
        android:text="No items."/>

7)GridView網格檢視(採用自定義SimpleAdapter)
GridView用於在介面上按行,列分佈的
方式來顯示多個元件,

GridView和ListView有共同的父類。
有很高的相似性,
唯一的區別:ListView只顯示一列,而GridView可以顯示多列。

 GridView提供的屬性:

android:columnWidth:設定列的寬度

 android:gravity:設定對齊方式


 android:horizontalSpacing:設定各元素之間的水平間距


 android:numColumns:設定列數

android:stretchMode:設定拉伸模式
它的值有:NO_STRETCH:不拉伸
STRETCH_SPACING:近拉伸元素之間的間距
STRETCH_SPACING_UNIFORM:表格元素本身,元素之間的間距一起拉伸
STRETCH_COLUMN_WIDTH:僅拉伸元素表格元素本身

 android:verticalSpacing:設定各元素之間的垂直間距

新增setOnItemClickListener(OnItemClickListener)
或者setOnItemSelectedListener(OnItemSelectedListener)

8)Spinner控制元件(採用ArrayAdapter)

使用entries設定顯示陣列資料

使用dropDownWidth、dropDownVerticalOffset、
popupBackground修改下拉視窗的樣式

dropDownWidth:設定下拉列表的寬度

android:dropDownSelector:設定Spinner元件的下拉框被選擇的動態效果屬性

popupBackground:下拉框的背景

使用ArrayAdapter為其設定相應資料、Spinner樣式及下拉視窗樣式等內容

android.R.layout.simple_spinner_item:設定spinner的樣式

adapter.setDropDownViewResouce(android.R.simple_spinner_dropdown_item):設定下拉框的樣式
新增setOnItemSelectedListener(OnItemSelectedListener)事件監聽器

9)AutoCompleteTextView自動完成文字框(採用ArrayAdapter)它是從EditText派生出來的,實際上也是一個文字編輯框,但比普通的編輯框多個一個功能:當用戶輸入一定字元之後,自動完成文字框會顯示一個下拉選單,供使用者從中選擇,當用戶選擇某個選單項之後,AutoCompleteTextView按用
戶選擇自動填寫該文字框。

相關屬性:
android:completionHint:設定下拉框選單中的提示標題

android:completionThreshold=”1”:設定使用者至少輸入幾個字元才會顯示提示

      android:dropDownWidth:設定下拉選單的寬度

android:popupBackgrounp:設定下拉選單的背景

使用AutoCompleteTextView很簡單,只要為它設定一個Adapter,
該Adapter封裝了AutoCompleteTextView預設的提示文字內容。

android.R.layout.simple_dropdown_item_1line:下拉框的介面

例如:百度搜索條

一.ExpandableListView元件是android中一個比較常用的元件,
當點選一個父item的時候可以將它的子item顯示出來,
像手機QQ中的好友列表就是實現的型別效果。
一般採用兩個佈局檔案,一個父Item的佈局檔案,一個
子Item的佈局檔案,使用ExpandableListView元件的
關鍵就是設定它的adapter,這個adapter必須繼承
BaseExpandableListAdapter類,所以實現運用
ExpandableListView的核心就是學會繼承這
個BaseExpanableListAdapter類

 該類的重寫方法有://獲取當前父Item的個數
    public int getGroupCount() {}       


                      //獲取當前父Item下的子item的個數
    public int getChildrenCount(int groupPosition) {}


                      //獲取當前父item的資料
    public Object getGroup(int groupPosition) {}


                      //得到子item需要關聯的資料
    public Object getChild(int groupPosition, int childPosition) {}


                     //獲取指定組的ID
    public long getGroupId(int groupPosition) {}


                     //返回子Item的ID
    public long getChildId(int groupPosition, int childPosition) {
    //子元素位置(相對於其它子元素)
return childPosition;
    }
   //組和子元素是否持有穩定的ID,也就是底層資料的改變不會影響到它們。
//如果為TRUE,意味著相同的ID永遠引用相同的物件。
public boolean hasStableIds() {

return true;
}
//設定父Item元件
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {}

//設定子Item的元件
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {}

//是否選中指定位置上的子元素。 是否選中子元素

  public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;}

補充:自定義前面的箭頭,
給ExpandableListView元件設定
屬性android:groupIndicator。
該屬性指定一個selector檔案。
如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">   
    <!--點開父Item-->
    <item android:state_expanded="true" 
          android:drawable="@drawable/lt_open" />   
    <item android:drawable="@drawable/lt_normal" />   
</selector> 

下面我就寫了一系列的介面卡載入資料的程式碼:
關鍵程式碼:
activity_main:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:entries="@array/msg"
        android:divider="#ab3fcc"
        android:dividerHeight="2dp"
        android:listSelector="@drawable/home_selector"
        android:id="@+id/lv"/>

</RelativeLayout>

arrays陣列程式碼:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 定義陣列 -->
    <string-array name="msg">
        <item >使用ArrayAdapter</item>
        <item >使用SimpleAdapter</item>
        <item >使用BaseAdapter</item>
        <item >使用ListActivity</item>
        <item >使用GridView</item>
        <item >使用可擴充套件view</item>
        <item >使用Spinner元件</item>
        <item >使用AutoCompleteTextView</item>

    </string-array>
    <string-array name="person" >
        <item>張三</item>
        <item>李四</item>
        <item>王五</item>
        <item>趙六</item>
        <item>孫七</item>
    </string-array> 
    <string-array name="pro">
        <item >江西</item>
        <item >江蘇</item>
        <item >四川</item>
        <item >上海</item>
    </string-array>

</resources>

效果圖如下:
這裡寫圖片描述
程式碼下載: