一、BaseAdapter簡介及使用場景
BaseAdapter 是一個抽象類,常用於和 Android 中的一些控件如ListView,GridView,ExpandableListview,Spinner 等控件結合來顯示數據的一種控件,在 Android 開發中佔有很重要的位置
二、BaseAdapter 的使用步驟
BaseAdapter 是一個抽象類,在使用時:
①首先,定義一個類來繼承該類;
②其次,實現裏面對應的抽象方法,同時完成方法體的書寫;
③最後,在相應的 Activity 中使用該適配器。
三、BaseAdapter 中抽象方法
public class AppListAdapter extends BaseAdapter{
@Override
public int getCount() {
return 0;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return null;
}
}
1、 需要重寫的方法及作用:
①數據的大小
public int getCount()
②返回當前position位置的這一條數據
public Object getItem(int position)
③返回當前position位置的這一條數據的ID
public long getItemId(int position)
④處理view和data填充數據的一個過程
publiv View getView(final int position, View convertView, ViewGroup parent)
2、getView方法
①參數介紹
position:從0開始
convertView:是Spinner,ListView中每一項要顯示的view
parent:父窗體,也就是Spinner,ListView,GridView了
通常return的view也就是convertView
②優化處理
第一種優化方法:
通過緩存convertView。這種利用緩存 contentView 的方式可以判斷如果緩存中不存在 View 才創建 View,如果已經存在可以利用緩存中的 View,提升了性能
public View getView(final int position,View convertView,ViewGroup parent){
if(convertView==null){
LayoutInflater layoutInflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.item_app_list_view,null);
}
ImageView mAppIconImageView=(ImageView)convertView.findViewById(R.id.app_icon_image_view);
TextView mAppNameTextView=(TextView)convertView.findViewById(R.id.app_name_text_view);
mAppIconImageView.setDrawbleResource(R.drawble.ic_launcher);
mAppNameTextView.setText("微信");
return convertView;
}
第二種優化方法:
1、通過 convertView+ViewHolder 來實現,ViewHolder 就是一個靜態類,使用 ViewHolder 的關鍵好處是緩存了顯示數據
的視圖(View),加快了 UI 的響應速度。
2、當我們判斷 convertView == null 的時候,如果爲空,就會根據設計好的 List 的 Item 佈局(XML)來爲 convertView 賦值,並生成一個 viewHolder 來綁定 converView 裏面的各 個 View 控件(XML 佈局裏面的那些控件)。再用 convertView 的 setTag 將 viewHolder 設置到 Tag 中,以便 系統第二次繪製 ListView 時從 Tag 中取出。(看下面代碼中)
3、如果 convertView 不爲空的時候,就會直接用 convertView 的 getTag()來獲得一個 ViewHolder。
/**
* 利用ViewHolder進行一個緩存
*/
public class ViewHolder{
public ImageView mAppIconImageView;
public TextView mAppNameTextView;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder=new ViewHolder();
if(convertView==null){
//把XML文件讀到Java中,變成一個View對象用於操作
LayoutInflater layoutInflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=layoutInflater.inflate(R.layout.item_app_list_view,null);
// 獲取控件
viewHolder.mAppIconImageView=(ImageView)convertView.findViewById(R.id.app_icon_image_view);
viewHolder.mAppNameTextView=(TextView)convertView.findViewById(R.id.app_name_text_view);
//讓convertView和viewHolder之間有一個對應關係
convertView.setTag(viewHolder);
}
else{
viewHolder= (ViewHolder) convertView.getTag();
}
// 和數據之間進行綁定
//獲取應用的名稱並與行佈局 View 綁定
viewHolder.mAppNameTextView.setText(mAppInfos.get(position).activityInfo.loadLabel(getPackageManager()));
//獲取應用的圖標並與行佈局 View 綁定
viewHolder.mAppIconImageView.setImageDrawable(mAppInfos.get(position).activityInfo.loadIcon(getPackageManager()));
return convertView;
}