今天出去面試,被面試官問到一個問題,說是如果使用LayoutInflate.inflate(int resource, ViewGroup root, boolean attachToRoot);這個方法與AbsListView的實作類結合使用的話,會出現什麼問題,先看簡單的使用過程:
好了,重點在第三行,我将Adapter的getView方法所傳回的ViewGroup parent對象放置到了inflate的第二個參數中使用,inflate的第三個參數為true,面試官當時問的就是會出現什麼問題,現在運作一下,看Log:

出了java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView的異常,我們看一下問題出在哪:
首先,要看從getView第三個參數回調傳回來的是什麼,我們來看源碼:
既然是adapter與AbsListView結合使用,那getView方法一定是在AbsListView中被使用的,來找一找:
首先該怎麼找呢?咱們都知道AbsListView通過setAdapter方法使兩者結合,那麼入口就在這裡:
通過第13行可以知道adapter對象是賦給了mAdapter,通過檢視mAdapter是父類的屬性,那咱們就需要在父類中看什麼時候使用了mAdaper.getView方法:
果然找到了,在AbsListView的obtainView方法中找到了getView方法被使用的情況:
通過第14行和最後一行可知,它是将AbsListView的實作類傳了過來。
那好,就回到 inflater.inflate(R.layout.activity_main, parent, true);這裡,繼續向下看:
這裡調用了重載方法
在重載方法内部我們看到:
也就是說把自定義的這個Item附加到了AbsListView上,好。接下來看getView被傳回的View被用作在了什麼地方,它目前已經有parent了。
還是需要回到AbsListView.obtainView方法,通過第14行可以看到這個通過getView方法傳回的View最終被obtainView彈了出去,繼續看,由于在AbsListView中沒有找到使用obtainView的地方,是以使用obtainView的地方應該在其子類中,果不其然(這裡通過ListView做示範):
我們在最後一行看到了obtainView的身影,它被用來做什麼呢?既然是onMeasure方法,那就是測量呗,沒什麼好說的,再繼續看,在ListView中發現5處obtainView被調用的地方,其中兩處用于測量,剩餘3處通過:
這個方法将obtainView傳回的View傳了進來,最終我們可以在該方法内部看到這麼一段代碼,是屬于ViewGroup的:
---未完待續---