安卓開發-Adapter 介面卡
Adapter:介面卡,因為ListView是一個View,不能新增子項,因此在呈現資料的時候就需要某種工具將資料呈現在ListView上,而Adapter就能充當此角色。
LayoutInflater
它的作用類似於findViewById(),不同點是LayoutInflater是用來找res/layout/下的xml佈局檔案,並且例項化;而findViewById()是找xml佈局檔案下的具體widget控制元件(如Button、TextView等)。
具體作用:
1)、對於一個沒有被載入或者想要動態載入的介面,都需要使用LayoutInflater.inflate()來載入;
2)、對於一個已經載入的介面,就可以使用Activiyt.findViewById()方法來獲得其中的介面元素。
獲得 LayoutInflater 例項的三種方式
- LayoutInflater inflater = getLayoutInflater();//呼叫Activity的getLayoutInflater()
- LayoutInflater inflater = LayoutInflater.from(context);
- LayoutInflater inflater = (LayoutInflater)context.getSystemService
ViewHolder
要想使用 ListView 就需要編寫一個 Adapter 將資料適配到 ListView上,而為了節省資源提高執行效率,一般自定義類 ViewHolder 來減少 findViewById() 的使用以及避免過多地 inflate view,從而實現目標。
Adapter的定義
1、繼承 BaseAdapter (可在繼承的時候指定泛型,擴充套件使用);
2、重寫四個基本方法:
getCount():獲取資料的總的數量,返回 int 型別的結果;
getItem(int position) :獲取指定位置的資料,返回該資料;
getItemId(int position):獲取指定位置資料的id,返回該資料的id,一般以資料所在的位置作為它的id;
getView(int position,View convertView,ViewGroup parent):關鍵方法,用於確定列表項
3、建立 ViewHolder (包含列表項的控制元件。)
程式碼展示
public class MyListAdapter extends BaseAdapter // 類定義
// 自定義資料集與佈局載入器
List<Note> notes;
LayoutInflater inflater;
/** 構造方法 */
public MyListAdapter(Context context,List<Note> notes){
this.notes = notes;
inflater = LayoutInflater.from(context);
}
/** 重寫方法 */
@Override
public int getCount(){
return notes.size();
}
@Override
public Object getItem(int position){
return notes.get(position);
}
@Override
public long getItemId(int position){
return position;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
ViewHolder viewHolder;
// 若無可重用的 view 則進行載入
if(converView == null){
convertView = inflater.inflate('列表項佈局檔案',parent,false);
// 初始化 ViewHolder 方便重用
viewHolder = new ViewHolder();
viewHolder.tvTitle = (TextView) convertView.findViewById('id1');
viewHolder.tvContent = (TextView) convertView.findViewById('id2');
converView.setTag(viewHolder);
}else{ // 否則進行重用
viewHolder = (ViewHolder)convertView.getTag();
}
// 獲得條目內容物件
Note note = notes.get(position);
// 設定內容(Note Bean 需要自定義)
viewHolder.tvTitle.setText(note.getTitle());
viewHolder.tvContent.setText(note.getContent());
return converView;
}
/** 建立 ViewHolder */
class ViewHolder{
TextView tvTitle;
TextView tvContent;
}