歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 看源碼之Adapter和AdapterView之間的關系

看源碼之Adapter和AdapterView之間的關系

日期:2017/3/1 9:32:36   编辑:Linux編程

總述

Android中“列表”的實現其實一個典型的MVC模式,其實中AdapterView相當於是View,負責視圖的繪制以及視圖的事件響應,Adapter相當於是Controller,負責控制數據的顯示內容和展現方式,另外項目中的實體類則是代表了Model。

Adapter

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

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

Copyright © Linux教程網 All Rights Reserved