ListView動態載入資料

weixin_34214500發表於2018-11-28

ListView是Android中常用的控制元件之一,一般用來展示那種列表的資訊。現在有RecycleView可以替代,效能也很好,但是ListView依然有著很大的使用範圍。ListView的使用方法很簡單,在佈局檔案中定義,在Activity裡面引用,在定義一個Adapter繼承自BaseAdapter(重寫幾個關鍵方法就行),最後關聯一些就OK了。

15096710-4ea7d7329f58742d.png
其中還可以新增很多屬性,達到不同效果

所有的關鍵在於Adapter中,自定義一個ListAdapter繼承自BaseAdapter。

15096710-829010f87ece7a83.png
如上

兩個常量不用做過多關心,是用來做佈局的。方法getItem(int position)和getItemId(int position)看名字就能明白是幹嘛用的了,不做過多的闡述。對於方法getCount()返回的是一個int值,這個就是指的是ListView中有多少個Item。一般就是有多少個實體類了。所以我直接了實體類集合的長度size();至於這個DataBean.mListViewData是我定義的一個常量工具類,就是把這個實體類的集合抽出來,唯一化,在之後更新資料的時候方便一點。具體程式碼如下:

15096710-77d88fe928131df4.png
實體類集合

下面關鍵看方法getView()和內部類ViewHolder。先上程式碼:

15096710-f42c6f1c2d994111.png
ViewHolder類

ViewHolder的出現是對ListView的一種優化,因為在ListView中的每一個Item的佈局樣式都是一樣的,所以其中findViewById()的過程結果都是一樣的,所以為了節省每次尋找浪費的時間就出現了ViewHolder,大概的意思就是把第一次查詢的結果記錄下來,之後直接呼叫結果就行了。比如我上面的ViewHolder中只有ImageView和TextView兩個控制元件,是因為我上面每個Item中就是這樣的佈局。同時,沒有必要每個Item都建立一個View,因為當Item被滑動到不可見時,那個不可見的View物件不會被銷燬,完全可以複用。

15096710-cde1195270a1343c.png
getView()方法

引數position指的是第幾條Item,引數convertView指的是是否有可複用的View。就是有沒有被建立了但是現在處於不可見狀態的View物件。在剛開始的時候這個都會是NULL。那個判斷語句中的過程就是在儲存和複用的過程,就是隻建立可見的數量的View物件。一個Recycle的迴圈而已。這張圖片可以很好的解釋這個過程。

15096710-b324d5c013133e36.png
摘自某部落格

後面的程式碼就是載入圖片和設定文字,之後返回這個convertView物件。這就是ListView的基本用法和ViewHolder的對ListView的優化。但是有一個問題,就是不能一下子將所有的Item全部載入出來,希望在我們下滑到底部的時候載入剩下的部分,這就是所說的動態載入。

動態載入就是現在ListView中載入一部分資料,然後設定一個監聽器,當監聽到ListView滑動到底部時,再載入接下來的資料,ListView再重新整理一下。具體過程如下

15096710-d01f426000832a05.png
繼承AbsListView.OnScrollListener介面
15096710-aab78b8aa73dcbd4.png
重寫這兩個方法

onScrollSatateChanged()中,int scrollState引數一般有三個值代表了三個狀態。SCROLL_STATE_TOUCH_SCROLL:手指正拖著ListView滑動。SCROLL_STATE_FLING:ListView正自由滑動。SCROLL_STATE_IDLE:ListView滑動後靜止。

onScroll()方法中的引數,firstVisibleItem:第一個可見Item的下標。visibleItemCount:可見Item的數量。totalItemCount:ListView中所有Item的數量。

15096710-d29d13252fea02f2.png
詳細如上

當載入完更多的資料之後,再呼叫listAdapter.notifyDataSetChanged()方法就可以對ListView中的Item做更新,載入更多。這個方法應該就是使用的觀察者模式,觀察到資料產生變化,則重新整理UI。

相關文章