Android的Adapter是連接後端數據和前端顯示的適配器接口,他有多種抽象類,在使用Gallery時候,我們繼承的BaseAdapter就是他的一個子類.
要實現BaseAdapter這個子類,我們要實現它的四個方法,
public int getCount()
public Object getItem(int position)
public long getItemId(int position)
public View getView(int position, View convertView, ViewGroup parent)
第一個方法和第四個方法比較好理解,第一個方法是返回我們後臺一共有多少數據,最後一個方法是返回一個加載了數據的view,以便於前面控件的調用.那麼第二個方法和第三個方法又是做什麼用的呢?我們需要返回什麼值呢?
察看Google的文檔,他在Gallery這個類中實現了一個BaseAdapter的子類,如下所示:
- public class ImageAdapter extends BaseAdapter {
- int mGalleryItemBackground;
- private Context mContext;
- private Integer[] mImageIds = {
- R.drawable.sample_1,
- R.drawable.sample_2,
- R.drawable.sample_3,
- R.drawable.sample_4,
- R.drawable.sample_5,
- R.drawable.sample_6,
- R.drawable.sample_7
- };
- public ImageAdapter(Context c) {
- mContext = c;
- TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery);
- mGalleryItemBackground = a.getResourceId(
- R.styleable.HelloGallery_android_galleryItemBackground, 0);
- a.recycle();
- }
- public int getCount() {
- return mImageIds.length;
- }
- public Object getItem(int position) {
- return position;
- }
- public long getItemId(int position) {
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- ImageView i = new ImageView(mContext);
- i.setImageResource(mImageIds[position]);
- i.setLayoutParams(new Gallery.LayoutParams(150, 100));
- i.setScaleType(ImageView.ScaleType.FIT_XY);
- i.setBackgroundResource(mGalleryItemBackground);
- return i;
- }
- }
裏面的getItem 和 getItemId這兩個方法統統地返回position這個變量,很奇怪的兩個方法,尤其是getItem,不是要返回Object嗎?怎麼返回了一個數字了?雖然數字也是一個Object,但是很明顯這個方法看起來不是要返回一個數字的.
那麼我們就來看源代碼吧,
BaseAdapter繼承了SpinnerAdapter ,我們在SpinnerAdapter中去找這個方法的調用,沒找到.BaseAdapter還繼承了ListAdapter,我們去找,還是沒有找到.
既然都沒有找到,那麼這兩個方法只能是適用這個Adapter的View來調用的,察看Gallery這個類,發現他繼承了AbsSpinner,而AbsSpinner繼承了AdapterView,在AdapterView類中,我們找到了如下的兩個方法,
- public Object getItemAtPosition(int position) {
- T adapter = getAdapter();
- return (adapter == null || position < 0) ? null : adapter.getItem(position);
- }
- public long getItemIdAtPosition(int position) {
- T adapter = getAdapter();
- return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
- }
這兩個方法是public的方法,說明我們可以直接調用Gallery的這兩個方法的,那麼AdapterView中有沒有調用這兩個方法呢?
經過察看源代碼發現, public Object getItemAtPosition(int position)這個方法單純是爲我們調用的,android在源碼中沒有調用這方法
public long getItemIdAtPosition(int position)這個方法會設置mNextSelectedRowId這個變量,而這個變量的設置好以後android也並沒有去取用,只提供了一個公共方法
public long getSelectedItemId() { return mNextSelectedRowId; }來返回這個變量
由此可見,這兩個方法對於android來講是沒有用的,單純是爲了客戶端調用的方便。所以我們可以返回任何對我們有用的值,而不需要顧及android對它們的使用(因爲根本就沒有使用)