簡析 Android Adapter適配器的內部調用流程


我們都知道使用Adapter為ListView或GridView填充數據,而我們需要實現Adapter里的getView、getCount等方法。但內部到底是怎么調用,怎么調用的getView方法,就需要看源碼了,下面來簡單分析一下:

以GridView為例,為它設置適配器的方法是GridView.setAdapter:

@Override
public void setAdapter(ListAdapter adapter) {
。。。。。。
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
。。。。。。
requestLayout();//調用了requestLayout重繪布局方法,簡稱 重繪(1)。
}
方法中為adapter注冊了一個監聽器AdapterDataSetObserver,它存在於GridView的父類AbsListView中(其實這個監聽器的真正實現是在AdapterView類中),這個監聽器有一個主要的監聽方法:
public void onChanged() {            mDataChanged = true;            mOldItemCount = mItemCount;            mItemCount = getAdapter().getCount();            // Detect the case where a cursor that was previously invalidated has            // been repopulated with new data.            if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null                    && mOldItemCount == 0 && mItemCount > 0) {                AdapterView.this.onRestoreInstanceState(mInstanceState);                mInstanceState = null;            } else {                rememberSyncState();            }            checkFocus();            requestLayout();//注意這里也調用了重繪布局方法,簡稱 重繪(2)        }
requestLayout會向系統發一個重新布局的message,重新布局就要重新測量,就要走measure流程,最終會調用到GridView中的onMeasure方法(具體過程可查看android內核剖析的第十三章關於View的繪制內容)。而在GridView的onMeasure中就會調用為GridView設置的Adapter對象的getCount、getItemType方法還會調用一個obtainView(存在於GridView的父類AbsListView中),obtainView中會就會調用Adapter的getView方法來獲得單個Item的View了。
 

了解了這些之后,就可以清楚的了解適配器的調用流程了:

場景1:我們在為GridView設置Adapter(GridView.setAdapter)時最終會調用 “重繪(1)”,然后就會一直調用到GridView的onMeasure方法,在onMeasure方法里就會調用Adapter的getcount、getView等方法獲取數據了。

場景2:當數據源改變,我們會調用adapter的notifyDataSetChanged方法來刷新數據,這樣會觸發Adapter中注冊的監聽器,最終會調用“重繪(2)”,之后就同場景1的過程一樣來獲取adapter的數據了。





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com