Android之Adapter系列之BaseAdapter類

BaseAdapter源碼定義

BaseAdapter是一個同時實現了ListAdapter和SpinnerAdapter的公共基類,同時BaseAdapter是一個抽象類。

源碼路徑:framework\base\core\java\android\widget\BaseAdapter.java

package android.widget;

import android.database.DataSetObservable;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;

/**
  * BaseAdapter是一個同時實現了ListAdapter和SpinnerAdapter的常用公共基類,
  * 因此BaseAdapter可以在ListView和Spinner控件中使用
  */
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {

    //DataSetObservable用來監測數據庫中數據變化
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false;
    }
    /**
      * 註冊DataSetObservable,當數據發生變化後通知View更新數據
      */
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }
    /**
      * 解除註冊DataSetObservable
      */
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    
    /**
	  * 通知那些註冊了DataSetObservable的observers,對應數據已經改變
	  * 那些加載了該類數據的View需要更新
	  */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    /**
	  * 通知那些註冊了DataSetObservable的observers,對應數據已經失效或者不可用
	  * 如果對應的數據再發生改變,那麼不再上報數據改變通知
	  */
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }

	/**
	  *  默認返回 true
	  */
    public boolean areAllItemsEnabled() {
        return true;
    }
	
	/**
	  *  默認返回 true
	  */
    public boolean isEnabled(int position) {
        return true;
    }

	/**
	  *  調用getView(position, convertView, parent);
	  */
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return getView(position, convertView, parent);
    }
	/**
	  *  默認返回 0
	  */
    public int getItemViewType(int position) {
        return 0;
    }
	/**
	  *  默認返回 1
	  */
    public int getViewTypeCount() {
        return 1;
    }
	/**
	  *  默認返回getCount() == 0,注意這裏調用的是getCount來返回adapter中的items
	  */   
    public boolean isEmpty() {
        return getCount() == 0;
    }
}
    BaseAdapter是Android應用程序中經常用到的基礎數據適配器的基類,它實現了Adapter接口。其主要用途是將一組數據傳到
像ListView、Spinner、Gallery及GridView等UI顯示組件進行顯示。但是BaseAdapter是一個基類,沒有實現綁定數據的功能。這
使得開發者可以更具自己的需求,自定義實現,只是實現起來稍微複雜一些。

BaseAdapter繼承事例

自定義adtapter,繼承BaseAdapter

class BaseAdapterDemo extends BaseAdapter {

		private LayoutInflater mInflater = null;

		public BaseAdapterDemo(Context context) {
			mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			return mData.size();
		}

		@Override
		public Object getItem(int position) {
			return mData.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder mViewHolder = null;
		    //convertView也是用來優化view加載的一種方式
			if (convertView == null) {
				mViewHolder = new ViewHolder();
				convertView = mInflater.inflate(R.layout.list_item, null);
				mViewHolder.mImageView = (ImageView) convertView
						.findViewById(R.id.image);
				mViewHolder.mTitle = (TextView) convertView
						.findViewById(R.id.title);
				mViewHolder.mSummary = (TextView) convertView
						.findViewById(R.id.summary);
				convertView.setTag(mViewHolder);
			} else {
				mViewHolder = (ViewHolder) convertView.getTag();
			}
			mViewHolder.mImageView.setBackgroundResource((Integer) mData.get(
					position).get(KEY_IMG));
			mViewHolder.mTitle.setText((String) mData.get(position).get(
					KEY_TITLE));
			mViewHolder.mSummary.setText((String) mData.get(position).get(
					KEY_SUMMARY));

			return convertView;
		}
	}
定義MainActivity
public class MainActivity extends Activity {

	    private ListView mListView;

	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
		    super.onCreate(savedInstanceState);
		    setContentView(R.layout.activity_main);
		    mListView = (ListView) findViewById(R.id.list);
		    mData = setData();
		    mListView.setAdapter(new BaseAdapterDemo(this));

	    }
    }
佈局文件list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  	  android:layout_width="match_parent"
  	  android:layout_height="50dp"
 	  android:orientation="horizontal" >

       <ImageView
     	   android:id="@+id/image"
   	   android:layout_width="wrap_content"
   	   android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:padding="5dp" />

        <LinearLayout
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:orientation="vertical"
           android:padding="5dp" >

            <TextView
               android:id="@+id/title"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:textAllCaps="true"
               android:textSize="25sp"
               android:textStyle="bold" />

            <TextView
               android:id="@+id/summary"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:textSize="18sp"
               android:textStyle="italic" />
        </LinearLayout>
    </LinearLayout>
佈局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 	   android:layout_width="fill_parent"
 	   android:layout_height="fill_parent"
 	   android:orientation="vertical" >

 	   <ListView
 	       android:id="@+id/list"
  	      android:layout_width="fill_parent"
  	      android:layout_height="fill_parent"
  	      android:fastScrollEnabled="true"
 	       />

</LinearLayout>
效果圖:

事例總結

本事例僅對BaseAdapter做了簡單繼承,說明了BaseAdapter的基本使用,詳細自定義,大家可以自由發揮,充分發揮BaseAdapter的特點。

源碼下載

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