Android中“列表”的實現其實一個典型的MVC模式,其實中AdapterView相當於是View,負責視圖的繪制以及視圖的事件響應,Adapter相當於是Controller,負責控制數據的顯示內容和展現方式,另外項目中的實體類則是代表了Model。
Adapter其實是個接口,並不是一個具體的類。它的主要最用就是作為一個AdapterView和Model間的橋梁,這一點在源碼中有很清楚的定義:
/**
* An Adapter object acts as a bridge between an {@link AdapterView} and the
* underlying data for that view. The Adapter provides access to the data items.
* The Adapter is also responsible for making a {@link android.view.View} for
* ... ...
*/
getView()是Adapter非常重要的函數之一,這個函數的主要作用就根據在"列表"中位置的不同而展示不同的數據。具體可詳見該方法的源碼注釋,上面已寫的非常清楚了。
另一個就是registerDataSetObserver()和unregisterDataSetObserver(),好吧,應該是一對,這其實就是典型的一個觀察者的設計模式,如果Adapter中需要加載的數據發生了變化,則我們就是通知Adapter來更新數據。當然,我們一般在項目中使用的是notifyDataSetChanged()方法,這是因為BaseAdapter不僅繼承了Adapter,而且還對其中的一些方法進行封裝,這其中就包括了DataSetObservable的notifyChanged()方法,源碼如下:
/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
AdapterView也是一個抽象類,例如AbListView等都是繼承它而來。AdapterView中主要是一些監聽器的設定,如:
Item 長按監聽器
public interface OnItemLongClickListener {
/**
* Callback method to be invoked when an item in this view has been
* clicked and held.
*... ...
*/
boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id);
}
Item 點擊監聽器
public interface OnItemClickListener {
/**
* Callback method to be invoked when an item in this AdapterView has
* been clicked.
*... ...
*/
void onItemClick(AdapterView<?> parent, View view, int position, long id);
}
還有最常用且基本的等方法,如:
/**
* Returns the adapter currently associated with this widget.
*... ...
*/
public abstract T getAdapter();
/**
* Sets the adapter that provides the data and the views to represent the data
* in this widget.
*... ...
*/
public abstract void setAdapter(T adapter);
雖然AdapterView只是一個抽象類,但是其中的"干貨"確實不是少,有著許多非常有用但是不常用的方法,如:
public boolean performItemClick(View view, int position, long id) {
if (mOnItemClickListener != null) {
playSoundEffect(SoundEffectConstants.CLICK);
if (view != null) {
view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
}
mOnItemClickListener.onItemClick(this, view, position, id);
return true;
}
return false;
}
顧名思義這是一個可以實現自動點擊Item的方法,當你需要時直接使用可以省去不少的功夫。
其實是由於上一篇文章探究Android中Listview顯示錯亂問題(http://www.linuxidc.com/Linux/2015-02/113876.htm),引起我對探究ListView的內部源碼的興趣,當然由於水平有限只是從比較淺層的角度進行了探究,以後有時間定會繼續研讀源碼。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11