編輯:關於Android編程
Android Adapter的幾個常用方法分享給大家,具體內容如下
1 ListView是在什麼時候設置對Adapter的數據監聽的?
在setAdapter(ListAdapter adapter)中,會先取消ListView中原來的mAdapter中的數據監聽(mAdapter.unregisterDataSetObserver(mDataSetObserver);),然後再設置對新設置的adapter的數據監聽。
2 getView(int position, View convertView, ViewGroup parent)
我們都知道mAdapter的getView方法很重要,那麼該方法在ListView是怎麼被利用的呢? 在ListView的源碼中沒有發現getView方法的調用,於是我們去ListView的父類AbsListView。在AbsListView中的obtainView中調用了getView,其主要代碼邏輯部分為:
View obtainView(int position, boolean[] isScrap) {
isScrap[0] = false;
View scrapView;
//從回收器中獲取view
scrapView = mRecycler.getScrapView(position);
View child;
if (scrapView != null) {
...
//若不為空,則傳入convertView,這樣的話重用了view,同時更新了數據
child = mAdapter.getView(position, scrapView, this);
...
} else {
//若為空,則在getView中重新創建HolderView,且填入數據
child = mAdapter.getView(position, null, this);
...
}
return child;
}
而obtainView又會在ListView的measure以及生成整個ListView等中用到。
對於重寫getView方法最終要的應該就是要記得convertView的重用了,沒有重用幾乎都會造成內存卸了。
3 getCount()
Adapter的getCount()用來干啥? 在ListView中,在onMeasure以及觸控分發響應等過程中都會用到Adapter的getCount()函數。毫無疑問的是:它應該返回底層數據的數據個數。
4 getItem(int position)
getItem()在AdapterView中被調用,然後供用戶調用:從這兩個函數的描述我們可以看出,我們應該在Adapter的getItem()方法中返回position對應的數據,但是不是說一定要返回用於在Item的View上展示的數據,這個還是看需求,雖然可能大部分情況都是返回View中展示的數據。
/**
* Gets the data associated with the specified position in the list.
*
* @param position Which data to get
* @return The data associated with the specified position in the list
*/
public Object getItemAtPosition(int position) {
T adapter = getAdapter();
return (adapter == null || position < 0) ? null : adapter.getItem(position);
}
/**
* @return The data corresponding to the currently selected item, or
* null if there is nothing selected.
*/
public Object getSelectedItem() {
T adapter = getAdapter();
int selection = getSelectedItemPosition();
if (adapter != null && adapter.getCount() > 0 && selection >= 0) {
return adapter.getItem(selection);
} else {
return null;
}
}
縱觀整個結構,可以說存在這樣的三層:dataLists(原底層數據)--Adapter--AdapterView,有了getItem()方法的存在,我們可以直接利用Adapter來獲取數據,而不需要獲取底層dataLists的引用;有了getItemAtPosition()方法的存在,我們可以直接利用AdapterView 獲取底層數據,而不需要獲取其Adapter的引用。這樣的話,對於編程的簡便性以及解耦性都好很多。
5 getItemId(int position)
在AdapterView中發現它的一些調用,
public long getItemIdAtPosition(int position) {
T adapter = getAdapter();
return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
}
private void fireOnSelected() {
if (mOnItemSelectedListener == null)
return;
int selection = this.getSelectedItemPosition();
if (selection >= 0) {
View v = getSelectedView();
//這裡調用的getItemId得到的返回值與selection都屬於同一個item的特征,其意義也就在於在選擇接口的onItemSelected方法中可
//以直接拿到該item的id,而不需要通過獲取adapter來間接實現
mOnItemSelectedListener.onItemSelected(this, v, selection,
getAdapter().getItemId(selection));
} else {
mOnItemSelectedListener.onNothingSelected(this);
}
}
int findSyncPosition() {
...
rowId = adapter.getItemId(seed);
if (rowId == idToMatch) { //從這裡來看,getItemId似乎應該對於不同的item返回不同的值,保持唯一性
// Found it!
return seed;
}
...
}
與上面分析的getItem()方法一樣,getItemId()和getItemIdAtPosition()都提供了編程上面的便利。但是目前來看,由於對id沒啥需求,所以大部分在重寫getItemId方法時都是直接返回的position值,這樣做也是對的,雖然從數據獲取上沒啥意義(我給你一個position,你原封不動的返回給我,啥意思)。但是我想說明的是,不要被這個做法所限制,而以為ItemId就是item在數據中的position。其實若有需求,可以利用getItemId()方法返回一些其他的值,比如每個item數據在數據庫中id值,或者每個人的身份證號等。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
深入理解JNI
最近在學習android底層的一些東西,看了一些大神的博客,整體上有了一點把握,也產生了很多疑惑,於是再次把鄧大神的深入系列翻出來仔細看看,下面主要是一些閱讀筆記。JNI
Android自定義滾動選擇器實例代碼
Android自定義滾動選擇器 實現圖片的效果 代碼如下package com.linzihui.widget;import android.annotation.Sup
Android開發ListView中下拉刷新上拉加載及帶列的橫向滾動實現方法
ListView 控件可使用四種不同視圖顯示項目。通過此控件,可將項目組成帶有或不帶有列標頭的列,並顯示伴隨的圖標和文本。可使用 ListView 控件將稱作 ListI
Android中View繪制流程分析
創建Window在Activity的attach方法中通過調用PolicyManager.makeNewWindo創建Window,將一個View add到WindowM