Android之BaseAdapter


一、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;
}
發佈了64 篇原創文章 · 獲贊 5 · 訪問量 9306
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章