1. 程式人生 > >Android應用開發基礎--Adapter

Android應用開發基礎--Adapter

match put 因此 tool per man 簡單的 ngs sim

Android——Adapter

  1. 基本概念

    Adapter(適配器),將一個類的接口變換成客戶端所期待的一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。顯然Adapter的存在就是為了配合兩個不同部分之間的互相協作,使之能夠協調工作。在Android中,Adapter是前臺UI與底層數據之間聯系的紐帶,它們之間的關系可表示如下圖。

    技術分享圖片

  2. 常用Adapter

    Adapter本身只是一個接口,它派生了ListAdapterSpinnerAdapter兩個子接口,其中ListAdapterAbsListView提供列表項,而SpinnerAdapter

    AbsSpinner提供列表項。Adapter接口及其實現類的繼承關系如下圖所示。

    技術分享圖片

    其中,BaseAdapterArrayAdapterSimpleAdapterSimpleCursorAdapter這幾個是比較常用的Adapter。從上圖中可以,看出BaseAdapter是比較重要的,在整個繼承關系中處於比較關鍵的位置。Adapter常用的實現類簡介如下:

    ArrayAdapter<T>

    任意類型(T)數組適配器

    BaseAdapter

    實現了公共基類Adapter,因此適用於ListView(通過實現指定的ListAdapter接口)

    Spinner(通過實現指定的SpinnerAdapter接口)

    CursorAdapter

    Cursor中的數據暴露給ListView控件

    HeaderViewListAdapter

    適用於有ListView HeaderListView控件

    ListAdapter

    擴展了Adapter,是ListViewts_列表數據之間的橋梁

    ResourceCursorAdapter

    創建在XML文件中定義的views

    SimpleAdapter

    將靜態數據映射到XML文件定義的view中,功能非常強大

    SimpleCursorAdapter

    cursor中的列映射到XML文件定義的TextViewImageView

    SpinnerAdapter

    擴展了Adapter,是Spinnerts_數據之間的橋梁

    WrapperListAdapter

    包含另外一個列表Adapter的列表Adapter

  3. 使用舉例
使用ArrayAdapter創建ListView

這是基本的方法,直接在XML界面中創建ListView,然後在對應的Activity類中進行Adapter綁定即可。註意,AdapterDemo繼承自Activity

效果如下:

技術分享圖片

Java文件如下所示:

package com.example.adapterdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class AdapterDemo extends Activity
{    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adapterdemo);
        String[] data= {"北京","上海","廣州","西安","南京","深圳","杭州"};
        
        ListView myLV = (ListView)findViewById(R.id.myListView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.mylv_item,data);
        
        myLV.setAdapter(adapter);
    }
}

Item布局如下,為一個簡單的TextView,用於定制每個Item的布局:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:id="@+id/mylv_item"
    android:textSize="18sp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android">
</TextView>

主界面布局如下:

<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"
    tools:context="${relativePackage}.${activityClass}" >
    <ListView
        android:id="@+id/myListView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</RelativeLayout>
使用ListActivity實現列表

這個方式繼承的是ListActivity類,而不是Activity類。ListActivity類默認顯示一個列表來展示數據,而且提供Item被點擊時的可進行相關操作的方法。

ListActivity的子類無須調用setContentView()方法來顯示某個界面,而是可以直接傳入一個內容AdapterListActivity的子類就可以呈現出一個列表。

ListActivity持有一個ListView對象,ListActivity無須界面布局文件——相當於它的布局文件中只有一個ListView,因此只要為ListActivity設置Adapter即可。當然用戶可以自己定制一個布局,然後在onCreate()方法中通過setContentView(int layoutId)方法來設置用戶的自定義布局。需要指出的是,由開發者指定界面布局文件中應該包含一個id"@+id/android:list"(如果使用代碼形式,則是android.R.id.lsit)的ListView

效果如下:

技術分享圖片

Java類文件如下,此例不需要布局文件,即Xml文件裏可以什麽沒有,或者直接不需要XML布局文件。直接一個java文件就可以了。

package com.example.listactivitydemo;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class ListActivityDemo extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_ts_list); //不需要布局文件,如果需要定制布局文件,則需要按上述說明,按規定指定@+id/android:list,上述詳見說明
        
        String [] str = {"HeFie","BeiJing"};         
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,str);
        setListAdapter(adapter);        
    }
}

使用SimpleAdapter創建ListView

SimpleAdapter的功能不簡單,相反它具有非常強大的功能,利用它,我們可以定制ListView的外觀,或者更復雜的ListView列表項,ListView的大部分場景都可以使用SimpleAdapter

效果如下:

技術分享圖片

Java類文件

package com.example.simpleadapter_demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class SimpleAdapter_Demo extends Activity {
    
    private String[] nameStrings = new String[]{"小紅","小明","小華"};
    private String[] descsStrings = new String[]{"紅紅","明明","華華",};
    private int[] imageIds = new int[]{R.drawable.libai,R.drawable.nongyu,R.drawable.qingzhao,R.drawable.tiger};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_adapter__demo);
        
        List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
        for(int i=0; i<nameStrings.length; i++)
        {
            Map<String, Object> listItem = new HashMap<String, Object>();
            listItem.put("header", imageIds[i]);
            listItem.put("personName", nameStrings[i]);
            listItem.put("decs", descsStrings[i]);
            listItems.add(listItem);
        }
        
        SimpleAdapter simpleAdapter = new SimpleAdapter(this,
                listItems, 
                R.layout.simple_item, 
                new String[] {"personName","header","decs"}, 
                new int[]{R.id.name,R.id.header,R.id.desc});
        
        ListView mylistview = (ListView)findViewById(R.id.mylistview);
        mylistview.setAdapter(simpleAdapter);        
    }
}

XML列表項布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<!-- 定義一個ImageView,用於作為列表項的一部分。 -->
<ImageView android:id="@+id/header"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:paddingLeft="10dp"
    />
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<!-- 定義一個TextView,用於作為列表項的一部分。 -->
<TextView android:id="@+id/name"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:textColor="#f0f"
    android:paddingLeft="10dp"
    />
<!-- 定義一個TextView,用於作為列表項的一部分。 -->
<TextView android:id="@+id/desc"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:textSize="14dp"
    android:paddingLeft="10dp"
    />
</LinearLayout>
</LinearLayout>

XML主界面布局只有一個ListView

<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"
    tools:context="${relativePackage}.${activityClass}" >
    
    <ListView
        android:id="@+id/mylistview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
</RelativeLayout>
使用BaseAdapter實現ListView

使用BaseAdapter可以取得對Adapter最大的控制權,程序要創建多少列表項,每個列表項的組件都由開發者來決定。

效果如下:

技術分享圖片

Java類文件:

package com.example.baseadapter;

import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class BaseAdapter_Demo extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter__demo);
        
        ListView myList = (ListView) findViewById(R.id.myList);
        BaseAdapter adapter = new BaseAdapter()
        {
            @Override
            public int getCount()
            {
                // 指定一共包含40個選項
                return 40;
            }
            @Override
            public Object getItem(int position)
            {
                return null;
            }
            // 重寫該方法,該方法的返回值將作為列表項的ID
            @Override
            public long getItemId(int position)
            {
                return position;
            }
            // 重寫該方法,該方法返回的View將作為列表框
            @Override
            public View getView(int position
                    , View convertView , ViewGroup parent)
            {
                // 創建一個LinearLayout,並向其中添加2個組件
                LinearLayout line = new LinearLayout(BaseAdapter_Demo.this);
                line.setOrientation(0);
                ImageView image = new ImageView(BaseAdapter_Demo.this);
                image.setImageResource(R.drawable.ic_launcher);
                TextView text = new TextView(BaseAdapter_Demo.this);
                text.setText("第" + (position +1 ) + "個列表項");
                text.setTextSize(20);
                text.setTextColor(Color.RED);
                line.addView(image);
                line.addView(text);
                // 返回LinearLayout實例
                return line;
            }
        };
        myList.setAdapter(adapter);
        
    }
}

XML布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
<ListView
    android:id="@+id/myList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</LinearLayout>

Android應用開發基礎--Adapter