溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

ListView 單條刷新方法實(shí)踐及原理解析

發(fā)布時(shí)間:2020-08-11 20:44:46 來(lái)源:網(wǎng)絡(luò) 閱讀:383 作者:yangxiaoming123 欄目:開(kāi)發(fā)技術(shù)

對(duì)于使用listView配合adapter進(jìn)行刷新的方法大家都不陌生,先刷新adapter里的數(shù)據(jù),然后調(diào)用notifydatasetchange通知listView刷新界面。

方法雖然簡(jiǎn)單,但這里面涉及到一個(gè)效率的問(wèn)題,調(diào)用notifydatasetchange其實(shí)會(huì)導(dǎo)致adpter的getView方法被多次調(diào)用 (畫(huà)面上能顯示多少就會(huì)被調(diào)用多少次),如果是很明確的知道只更新了list中的某一個(gè)項(xiàng)的數(shù)據(jù)(比如用戶(hù)點(diǎn)擊list某一項(xiàng)后更新該項(xiàng)的顯示狀態(tài),或者 后臺(tái)回調(diào)更新list某一項(xiàng),等等),應(yīng)該盡量避免getView被無(wú)辜的多次調(diào)用,特別是當(dāng)后臺(tái)線程特別多,回調(diào)的頻率特別高,并且界面的布局優(yōu)化得不是特別好的時(shí)候,使用notityDataSetChaned()方法來(lái)更新界面就會(huì)顯得列表卡頓,用戶(hù)體驗(yàn)不佳。

下面我們來(lái)介紹一下如何對(duì)listView進(jìn)行單條刷新:

首先我們看一下adapter的getView方法,我們要進(jìn)行單條刷新就要手動(dòng)調(diào)用這個(gè)方法。

public View getView(int position, View convertView, ViewGroup parent)

那么這三個(gè)參數(shù)是如何確定的呢,第三個(gè)參數(shù)很好確定,就是你的listview。

為了確定另外兩個(gè)參數(shù)position和converView,這里介紹幾個(gè)lisView的新方法:

getFirstVisiblePosition(),該方法獲取當(dāng)前狀態(tài)下list的第一個(gè)可見(jiàn)item的position。

getLastVisiblePosition(),該方法獲取當(dāng)前狀態(tài)下list的最后一個(gè)可見(jiàn)item的position。

getItemAtPosition(int position),該方法返回當(dāng)前狀態(tài)下position位置上listView的convertView

ps:這里的convertView是復(fù)用的,也就是說(shuō)不管position的值是多大(這個(gè)要看你整個(gè)list有多大),converView的個(gè)數(shù)應(yīng)該始終是屏幕上能顯示的list的條數(shù)那么多。

所 以,我們通過(guò)從getFirstVisiblePosition的值到getLastVisiblePosition的值之間的listitem和需要進(jìn) 行更新的條件(比如id)進(jìn)行比較確定哪一個(gè)是要更新的(如果不在當(dāng)前可是范圍內(nèi)也就沒(méi)有必要更新了,等list拉動(dòng)的時(shí)候自然就會(huì)更新出來(lái))


代碼如下,其實(shí)這個(gè)方法是google 2011年開(kāi)發(fā)者大會(huì)上提出的方法——ListView單條更新

?

1
2
3
4
5
6
7
8
9
10
11
12
private void updateSingleRow(ListView listView, long id) { 
   
        if (listView != null) { 
            int start = listView.getFirstVisiblePosition(); 
            for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++) 
                if (id == ((Messages) listView.getItemAtPosition(i)).getId()) { 
                    View view = listView.getChildAt(i - start); 
                    getView(i, view, listView); 
                    break
                
        
    }



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI