常用但忽略的anroid知識3-Adapter

轉自http://blog.csdn.net/kieven2008/article/details/6576439


Android Adapter適配器


Adapter的作用就是ListView界面與數據之間的橋樑,當列表裏的每一項顯示到頁面時,都會調用Adapter的getView方法返回一個View。

Android中有很多的適配器,首先看看這些適配器的繼承結構

Data、Adapter、View三者的關係
 
Data、Adapter、View三者的關係

一個listAdapter用來管理一個用一組任意對象的數組填充的ListView。
ListAdapter列表項的顯示配置:
一、 通過簡單XML文件配置
默認的ListAdapter希望提供的ListView每一項的 xml佈局配置文件中只有一個TextView。
構造函數:public ArrayAdapter (Context context, int textViewResourceId)
  context: 當前的上下文對象
  textViewResourceId: The resource ID for a layout file containing a TextView to use when instantiating views. 一個包含了TextView的佈局xml文件的id,注意(這個佈局文件裏只能有TextView一個控件,TextView不能有父控件,否則會報錯 java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView)
  類似於這種的xml
  <?xml version="1.0" encoding="utf-8"?>
  <TextView android:id="@+id/subject"
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:layout_marginTop="5dip" android:textAppearance="?android:attr/textAppearanceMedium"
   android:singleLine="true" android:ellipsize="end" />
 public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
  objects:用來填充ListView,給ArrayAdapter提供數據的數組
public ArrayAdapter (Context context, int textViewResourceId, List<T> objects)
//建議使用這個,直接給ArrayAdapter填充了數據
二、 複合佈局文件XML配置
如果你想使用一個複合佈局的話,你就要使用含有id字段的構造函數了,這個id要去引用這個複雜佈局文件 中的一個TextView,TextView被引用了,使用數組中的對象,調用toString方法,轉換成字符串來填充這個TextView,你可以使 用包含自定義對象的數組或者集合。重寫自定義對象的toString()方法,來保證ListView顯示。
public ArrayAdapter (Context context, int resource, int textViewResourceId)
這個是用來複雜佈局的,ListView的Item項的佈局文件中不止含有一個TextView控件
  resource: The resource ID for a layout file containing a layout to use when instantiating views. ListView中Item項的複雜佈局xml文件
  textViewResourceId:The id of the TextView within the layout resource to be populated(顯示) ListView中Item項的複雜佈局xml文件中用來顯示ArrayAdapter中數據的那個TextView
public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)
public ArrayAdapter (Context context, int resource, int textViewResourceId, List<T> objects)
//建議使用這個,直接給ArrayAdapter填充了數據。
  方法:
  這個方法能夠使用數組xml文件中配置的數據來創建一個ArrayAdapter,這個數組中的內容如何獲得,通過this.getResources().getTextArray(id)方法獲得。
  自定義數組xml文件的標識id號,也就是ArrayAdapter要綁定到ListVIew中的數據
textViewResourceId:用於顯示數組數據的佈局文件的id標識號(注意:該佈局文件中只能有一個TextView,有多個就會報錯,一般是 ClassCastException)
三、 通過重寫Adapter的getView方法來得到你想要的view。
你也可以是使用其他的一些非TextView 控件來顯示數組中的數據,通過重寫Adapter的getView方法來得到你想要的view。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}

static class ViewHolder {
TextView text;
ImageView icon;
}


BaseAdapter是一個抽象類,繼承它需要實現較多的方法,所以也就具有較高的靈活性
構造一個Adapter:
public class xxxxAdapter extends BaseAdapter {

private Context context;
private List<xxxx> xxxxList;

public xxxxAdapter(Context context, List<xxxx> weatherList ) {
this.context = context;
this.xxxxrList = xxxxList;
}
//1.先判斷adapter 有多少數據項,根據這個數據確定有多少item.
public int getCount() {
return xxxxList!=null? xxxxList.size() :0;
}

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

public long getItemId(int position) {
return position;
}
//2 確定每個item里加載哪個View
public View getView(int position, View convertView, ViewGroup parent) {
參考上面
}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章