對于使用listview配合adapter進行重新整理的方法大家都不陌生,先重新整理adapter裡的資料,然後調用notifydatasetchange通知listview重新整理界面。
方法雖然簡單,但這裡面涉及到一個效率的問題,調用notifydatasetchange其實會導緻adpter的getview方法被多次調用(畫面上能顯示多少就會被調用多少次),如果是很明确的知道隻更新了list中的某一個項的資料(比如使用者點選list某一項後更新該項的顯示狀态,或者背景回調更新list某一項,等等),應該盡量避免getview被無辜的多次調用,特别是當背景線程特别多,回調的頻率特别高,并且界面的布局優化得不是特别好的時候,使用notitydatasetchaned()方法來更新界面就會顯得清單卡頓,使用者體驗不佳。
下面我們來介紹一下如何對listview進行單條局部重新整理:
首先我們看一下adapter的getview方法,我們要進行單條重新整理就要手動調用這個方法。
public view getview(int position, view convertview, viewgroup parent)
那麼這三個參數是如何确定的呢,第三個參數很好确定,就是你的listview。
為了确定另外兩個參數position和converview,這裡介紹幾個lisview的新方法:
getfirstvisibleposition(),該方法擷取目前狀态下list的第一個可見item的position。
getlastvisibleposition(),該方法擷取目前狀态下list的最後一個可見item的position。
getitematposition(int position),該方法傳回目前狀态下position位置上listview的convertview
ps:這裡的convertview是複用的,也就是說不管position的值是多大(這個要看你整個list有多大),converview的個數應該始終是螢幕上能顯示的list的條數那麼多。
是以,我們通過從getfirstvisibleposition的值到getlastvisibleposition的值之間的listitem和需要進行更新的條件(比如id)進行比較确定哪一個是要更新的(如果不在目前可是範圍内也就沒有必要更新了,等list拉動的時候自然就會更新出來)
代碼如下,其實這個方法是google 2011年開發者大會上提出的方法——listview單條更新: