原文來自:http://www.2cto.com/kf/201405/299601.html,我自己做了一些修改
Android中繼承BaseAdapter后需要重寫四個函數,但一般還要寫一個構造函數用於初始化項數據,如List<T> dataList:
一、是int getCount(){}函數,這個是返回Adapter 連接/綁定 的數據集合的長度,也是對應容器View(如ListView)的項的個數。
二、是View getView(int position, View convertView, ViewGroup parent){}函數,這個是返回parent中每個項(如ListView中的每一行)的View。
剩下兩個getItem(int position)和getItemId(int position)詳細的說一說:
首先看 getItem:
@Override
public Object getItem(int position) {
...
}
官方解釋是Get the data item associated with the specified position in the data set.即獲得相應數據集合中特定位置的數據項。那么該方法是在哪里被調用呢?什么時候被調用呢?
通過查看源代碼發現,getItem方法不是在Baseadapter類中被調用的,而是在Adapterview中被調用的。
AdapterView類中,我們找到了如下方法,
public Object getItemAtPosition(int position) { T adapter = getAdapter(); return (adapter == null || position < 0) ? null : adapter.getItem(position); }
那么getItemAtPosition(position) 又是什么時候被調用?答案:它也不會被自動調用,它是用來在我們設置
setOnItemClickListener、setOnItemLongClickListener、setOnItemSelectedListener的點擊選擇處理事件中方便地調用
來獲取當前行數據的。官方解釋Impelmenters can call getItemAtPosition(position) if they need to access the data
associated with the selected item.所以一般情況下,我們可以這樣寫:
注意:這里的Object可以換成具體的類型,或泛型。
@Override
public Object getItem(int position) {
return this.dataList.get(position);
}
當然如果你喜歡,也可以在里面直接返回null(前提是你確信不會用到它的返回值)
至於getItemId(int position),它返回的是該postion對應item的id,AdapterView也有類似方法:
public long getItemIdAtPosition(int position) { T adapter = getAdapter(); return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position); }
不同getItem的是,某些方法(如ListView的setOnItemClickListener(new AdapterView.OnItemClickListener(){@Override public void onItemClick(...))有id這個參數(最后一個long id),而這個id參數就是取決於getItemId()這個返回值的。
我們一般可以這樣實現:
@Override public long getItemId(int position) { return position; }