Android-Adapter應用總結

來源:互聯網
上載者:User

      首先來看一下Adapter的體繫結構:

      一個Adapter的對象扮演一個橋樑的角色。這個橋樑串連著一個AdapterView和它所包含的資料。Adapter提供了一個通到資料項目的途徑。Adapter還負責為在資料集裡的每個資料生項產生一個View。它有一個重要的方法:public abstract View getView (int position,View convertView,ViewGroup parent)。這個方法被setListAdapter(adapter)間接地調用。getView
方法的作用是得到一個View,這個view顯示資料項目裡指定位置的資料,你可以或者手動建立一個view或者從一個XML layout中inflate。當這個view被inflated,它的父view(如GridView,ListView等)將要使用預設的 layout參數,除非你用inflate(int,android.view.ViewGroup,boolean)方法來指定一個根view並防止附著在根上。

下面分別講一下它的幾個常見的子類:

ListAdapter介面:繼承於Adapter。ListAdapter是一個ListView和list上的資料之間的橋樑。資料經常來自於一個Cursor,但這不是必須的。ListView能顯示任何資料,只要它是被一個ListAdapter封裝的。

      BaseAdapter抽象類別:是一個實現了既能在ListView(實現了ListAdapter介面)和Spinner(實現了Spinner 介面)裡用的Adapter類的一般基類。

      ArrayAdapter類:一個管理這樣的ListView的ListAdapter:這個ListView被一個數組所支援。這個數組可裝任意對象。預設狀態下,這個類預期能這樣:提供的資源id與一個單獨的TextView相關聯。如果你想用一個更複雜的layout,就要用包含了域id的建構函式。這個域id能夠與一個在更大的layout資源裡的TextView相關聯。它將被在數組裡的每個對象的toString()方法所填滿。你可以添加通常對象的lists或arrays。重寫你對象的toString()方法來決定list裡哪一個寫有資料的text將被顯示。如果想用一些其它的不同於TextView的view來顯示數組(比如ImageViews),或想有一些除了toString()傳回值所填在views裡的以外的資料,你就要重寫getView(int,View,ViewGroup)方法來返回你想要的View類型。

      SimpleAdapter類:一個使待用資料和在XML中定義的Views對應起來的簡單adapter。你可以把list上的資料指定為一個 Map範型的ArrayList。ArrayList裡的每一個條目對應於list裡的一行。Maps包含著每一行的資料。你先要指定一個XML,這個 XML定義了用於顯示一行的view。你還要指定一個對應關係,這個對應關係是從Map的keys對應到指定的views。綁定資料到views發生在兩個階段:如果一個simpleAdapter.ViewBinder是可用的,那麼
SetViewValue(android.view.View,Object,String)要被調用。如果返回true,那麼綁定發生了。如果返回 false,那麼如下views將被按順序地嘗試:

~實現了Checkable的View(如CheckBox),預期的綁定值是boolen

~TextView,預期的綁定值是String,並且SetViewText方法被調用

~ImageView,預期的綁定值是一個資源的id或String。並且SetViewImage方法被調用

如果沒有合適的綁定被發現,一個IllegalStateException被拋出。

下面是一個SimpleAdapter的例子:

/*--------------------mail.xml---------------------------*/

xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">android:layout_width="fill_parent"android:layout_height="fill_parent"android:id="@+id/MyListView">

/*--------------------simple_list_item_2.xml---------------------------*/

xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/widget0"android:layout_width="fill_parent"android:layout_height="fill_parent">android:id="@+id/ItemImage"android:layout_width="wrap_content"android:layout_height="wrap_content">android:id="@+id/ItemTitle"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="TextView"android:layout_x="50px"android:textSize="15pt">android:id="@+id/ItemText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="TextView"xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/widget0"android:layout_width="fill_parent"android:layout_height="fill_parent">android:id="@+id/ItemImage"android:layout_width="wrap_content"android:layout_height="wrap_content">android:id="@+id/ItemTitle"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="TextView"android:layout_x="50px"android:textSize="15pt">android:id="@+id/ItemText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="TextView"android:layout_x="50px"android:layout_y="40px">android:id="@+id/ItemCheck"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="270px">android:layout_x="50px"android:layout_y="40px">android:id="@+id/ItemCheck"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="270px">

/*--------------------TestUIList.java---------------------------*/

public class TestUIList extends Activity {public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ListView list = (ListView) findViewById(R.id.MyListView);ArrayList> lstImageItem = new ArrayList>();String[] str1 = { "row one", "row two", "row three", "row four" };String[] str2 = { "第一行", "第二行", "第三行", "第四行" };for (int i = 0; i < str1.length; i++) {HashMap map = new HashMap();map.put("ItemImage", R.drawable.icon);map.put("ItemTitle", str1[i]);map.put("ItemText", str2[i]);lstImageItem.add(map);}SimpleAdapter saImageItems = new SimpleAdapter(this,lstImageItem,R.layout.simple_list_item_2,new String[] { "ItemImage", "ItemTitle", "ItemText" },new int[] { R.id.ItemImage, R.id.ItemTitle, R.id.ItemText });list.setAdapter(saImageItems);}}

如果你的ListView的每一行想實現被點擊後有響應事件。最省事發的方法是繼承一個ListActivity。ListActivity是一個這樣的Activity:這個Activity能通過綁定到一個像array或cursor這樣的資料來源來顯示一些items的list,並且當使用者選了一個item時,能夠暴露事件控制代碼。

ListActivity擁有一個ListView對象。這個ListView對象能夠被綁定到不同的資料來源,特別是一個數組或者一個擁有查詢結果的Cursor。ListActivity有三種用法,分別是Binding,Screen Layout和Row Layout。下面僅討論一下Screen Layout:

ListActivity有一個預設的layout。這個 layout是由一個在螢幕中央的、單獨的、全屏的list構成。然而,如果你想的話,你可以通過在onCreate()裡調用 setContentView()方法來設定你自己的view layout的方式制定螢幕layout。要這樣做,你自己的view必須包含一個id為“@android:id/android:list”(或者在代碼中有list對象)。

隨意地,當你制定這個view是空的時,你能夠包含任何類型的view對象來顯示。這個“空list”通知者必須有一個 id“android:empty”。

注意,最後一定要調用setListAdapter(adapter)方法來把通過Adapter綁定了資料的這個List顯示出來。 setListAdapter方法間接調用了Adapter的getView方法,其作用是返回你想要的view類型。而且當點擊listView裡的 item時,會根據getView重畫這個ListView。例子可參見《Android SDK開發大全》中的“資源管理員“的例子。

想要實現事件監聽,就要重寫 protected void onListItemClick(ListView l, View v, int position,long id)方法。

想要把在XML中自訂了一行的view逐行顯示在ListActivity中自訂的ListView中,並且在每行動態綁定資料的話,一般要自己寫一個MyAdapter類,這個Adapter繼承BaseAdapter並且其建構函式中至少有一個List參數來實現動態綁定資料。有兩個重要的步驟:

1)重寫getView方法,其中一重要步驟就是用items.get(position)方法來獲得被傳入的資料。其中items是一個 List,它被賦了傳入的List參數的值。position是這個資料在ListView中的行數。Get返回的是E類型.即List中的模板類型。

2)寫一個內部類private class ViewHolder。這個內部類只有成員變數,它們就是你想在ListView中的一行裡要顯示的小View成分。

要想在Adapter中動態傳入其它類的資料,就要在建構函式中再增加一個(或更多)List參數。

最後我們給出自己些的MyAdapter配合ListActivity實現監聽事件的例子:

/*--------------------MyHome.java-----------------------*/

package com.li.android.myhome;import java.util.ArrayList;import java.util.List;import android.app.AlertDialog;import android.app.ListActivity;import android.content.DialogInterface;import android.os.Bundle;import android.view.View;import android.widget.ListView;public class MyHome extends ListActivity{private List items = null;protected void onCreate(Bundle icicle){super.onCreate(icicle);setContentView(R.layout.main);items = new ArrayList();String[] titles ={ "預設主題", "主題-A", "主題-B", "中秋佳節", "粉紅女郎", "花樣年華" };for (int i = 0; i < titles.length; i++){String title = titles[i];items.add(title);}setListAdapter(new MyAdapter(this, items));}@Overrideprotected void onListItemClick(ListView l, View v, int position,long id){new AlertDialog.Builder(MyHome.this).setItems(R.array.items_my_dialog, new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int whichcountry){}}).show();}}

/*--------------------MyAdapter.java-----------------------*/

package com.li.android.myhome;import java.util.List;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MyAdapter extends BaseAdapter{private LayoutInflater mInflater;private Bitmap icom_theme;private Bitmap icon_selected32;private List items;public MyAdapter(Context context, List it){mInflater = LayoutInflater.from(context);items = it;icom_theme = BitmapFactory.decodeResource(context.getResources(),R.drawable.theme);icon_selected32 = BitmapFactory.decodeResource(context.getResources(), R.drawable.selected32);}public int getCount(){return items.size();}public Object getItem(int position){return items.get(position);}public long getItemId(int position){return position;}public View getView(int position, View convertView, ViewGroup parent){ViewHolder holder;convertView = mInflater.inflate(R.layout.file_row, null);holder = new ViewHolder();holder.text = (TextView) convertView.findViewById(R.id.text);holder.mTheme = (ImageView) convertView.findViewById(R.id.theme);holder.mSelected32 = (ImageView) convertView.findViewById(R.id.selected32);holder.mTheme.setImageBitmap(icom_theme);String title = items.get(position);holder.text.setText(title);holder.mSelected32.setImageBitmap(icon_selected32);return convertView;}private class ViewHolder{TextView text;ImageView mTheme;ImageView mSelected32;}}

/*--------------------main.xml-----------------------*/

xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">android:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="wrap_content">

/*-------------------- file_row.xml-----------------------*/


xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/widget0"android:layout_width="fill_parent"android:layout_height="fill_parent" >android:layout_width="wrap_content"android:layout_height="wrap_content">android:id="@+id/text"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_x="50px"android:textSize="15pt">android:id="@+id/selected32"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_x="270px">

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.