ListView中Adapter簡介

在學習安卓UI控件的時候,發現ListView是在實際開發中會比較常用的一個控件,可以以列表的形式展示數據。但是學習時感覺它比別的控件使用起來要麻煩一些,因為需要設置適配器,然后通過適配器去訪問數據。這不免讓我對這種機制感到好奇,所以大概研究了一下Adapter以及ListView的大致工作流程。

引入Adapter主要是因為ListView需要展示很多數據,然而這些數據的形式是各種各樣的(比如數組、游標等),如果ListView要負責適配數據擴展性就比較差。然后Adapter就是起到了ListView與數據源之間橋梁的作用。ListView只負責展示數據而讓Adapter去訪問數據源,同時因為Adapter有著統一的接口所以ListView并不需要額外的適配問題,適配問題交由Adapter實現不同的子類,由這些子類負責與特定數據源的適配。Android中適配器主要類型有ArrayAdapterSimpleAdapterSimpleCursorAdapter自定義的Adapter。這里就列舉一個自定義Adapter的例子,由它去研究一下Adapter的實現(這里的例子使用第一行代碼中的示例)。


這里截取比較重要的地方的代碼,ListView的大致工作流程就是新建一個Adapter(上面用一個自定義的Adapter來裝配數據,它的構造需要this、每行的布局文件和數據源文件),把數據源列表傳給這個Adapter,通過Adapter的getView()方法生成每一行對應的視圖,最后通過ListView設置Adapter完成工作。不難發現Adapter的重點就在于這個getView()方法,接下來對這個方法進行一些簡要的介紹。下面是getView方法的源碼。


在getView()方法的參數中,第二個參數convertView是什么呢?這里先放上一張很經典的圖


因為ListView一般數據量很大,所以為每一行創建一個View是不現實的做法。Android提供了一個叫做Recycler的控件進行視圖的緩存,原理見上圖。當某一行完全移出屏幕的可視區域時,這個Item的View會被加入到Recycler中,這就是convertView參數。getView()方法中先判斷convertView是不是null,是的話新建,否則可以直接從Recycler中取出使用,然后在view中設置需要的新數據即可。就比如上圖中一個屏幕最多能顯示7條數據,所以開始的7條convertView都是null,所以生成了7個view。當繼續往下滑動item1完全移出屏幕時這個view被加入到Recycler中,當item8進入屏幕時,此時檢查Recycler中是否有可用的view,發現此時convertView不是null,就直接從Recycler中把view1取出賦上item8的數據即可。

這樣就不難理解getView()方法了,position是指該視圖在適配器數據中的位置,通過getCount和getItem來使用,通過position獲取特定的數據源數據,然后生成對應一行的視圖,然后交由ListView展示。


參考文獻:

Android ListView工作原理完全解析,帶你從源碼的角度徹底理解

詳解listview的四種適配器模式

Android第一行代碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容