Android Adapter 接口中幾個方法的研究

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的子類,如下所示:

  1. public class ImageAdapter extends BaseAdapter { 
  2. int mGalleryItemBackground; 
  3. private Context mContext; 
  4.  
  5. private Integer[] mImageIds = { 
  6. R.drawable.sample_1, 
  7. R.drawable.sample_2, 
  8. R.drawable.sample_3, 
  9. R.drawable.sample_4, 
  10. R.drawable.sample_5, 
  11. R.drawable.sample_6, 
  12. R.drawable.sample_7 
  13. }; 
  14.  
  15. public ImageAdapter(Context c) { 
  16. mContext = c; 
  17. TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery); 
  18. mGalleryItemBackground = a.getResourceId( 
  19. R.styleable.HelloGallery_android_galleryItemBackground, 0); 
  20. a.recycle(); 
  21.  
  22. public int getCount() { 
  23. return mImageIds.length; 
  24.  
  25. public Object getItem(int position) { 
  26. return position; 
  27.  
  28. public long getItemId(int position) { 
  29. return position; 
  30.  
  31. public View getView(int position, View convertView, ViewGroup parent) { 
  32. ImageView i = new ImageView(mContext); 
  33.  
  34. i.setImageResource(mImageIds[position]); 
  35. i.setLayoutParams(new Gallery.LayoutParams(150, 100)); 
  36. i.setScaleType(ImageView.ScaleType.FIT_XY); 
  37. i.setBackgroundResource(mGalleryItemBackground); 
  38.  
  39. return i; 

裏面的getItem 和 getItemId這兩個方法統統地返回position這個變量,很奇怪的兩個方法,尤其是getItem,不是要返回Object嗎?怎麼返回了一個數字了?雖然數字也是一個Object,但是很明顯這個方法看起來不是要返回一個數字的.

那麼我們就來看源代碼吧,

BaseAdapter繼承了SpinnerAdapter ,我們在SpinnerAdapter中去找這個方法的調用,沒找到.BaseAdapter還繼承了ListAdapter,我們去找,還是沒有找到.

既然都沒有找到,那麼這兩個方法只能是適用這個Adapter的View來調用的,察看Gallery這個類,發現他繼承了AbsSpinner,而AbsSpinner繼承了AdapterView,在AdapterView類中,我們找到了如下的兩個方法,

  1. public Object getItemAtPosition(int position) { 
  2.           T adapter = getAdapter(); 
  3.           return (adapter == null || position < 0) ? null : adapter.getItem(position); 
  4.   } 
  5.  
  6.   public long getItemIdAtPosition(int position) { 
  7.           T adapter = getAdapter(); 
  8.           return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position); 
  9.   } 

這兩個方法是public的方法,說明我們可以直接調用Gallery的這兩個方法的,那麼AdapterView中有沒有調用這兩個方法呢?

經過察看源代碼發現, public Object getItemAtPosition(int position)這個方法單純是爲我們調用的,android在源碼中沒有調用這方法

public long getItemIdAtPosition(int position)這個方法會設置mNextSelectedRowId這個變量,而這個變量的設置好以後android也並沒有去取用,只提供了一個公共方法

public long getSelectedItemId() {        return mNextSelectedRowId;    }來返回這個變量

由此可見,這兩個方法對於android來講是沒有用的,單純是爲了客戶端調用的方便。所以我們可以返回任何對我們有用的值,而不需要顧及android對它們的使用(因爲根本就沒有使用)

 

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