Android之Adapter系列之BaseAdapter类

来源:互联网 发布:软件定制价格 编辑:程序博客网 时间:2024/05/21 12:36

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);}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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的特点。

源码下载

0 0
原创粉丝点击