Android ListView 單條刷新方法實(shí)踐及原理解析
對(duì)于使用listView配合adapter進(jìn)行刷新的方法大家都不陌生,先刷新adapter里的數(shù)據(jù),然后調(diào)用notifydatasetchange通知listView刷新界面。
方法雖然簡單,但這里面涉及到一個(gè)效率的問題,調(diào)用notifydatasetchange其實(shí)會(huì)導(dǎo)致adpter的getView方法被多次調(diào)用 (畫面上能顯示多少就會(huì)被調(diào)用多少次),如果是很明確的知道只更新了list中的某一個(gè)項(xiàng)的數(shù)據(jù)(比如用戶點(diǎn)擊list某一項(xiàng)后更新該項(xiàng)的顯示狀態(tài),或者 后臺(tái)回調(diào)更新list某一項(xiàng),等等),應(yīng)該盡量避免getView被無辜的多次調(diào)用,特別是當(dāng)后臺(tái)線程特別多,回調(diào)的頻率特別高,并且界面的布局優(yōu)化得不是特別好的時(shí)候,使用notityDataSetChaned()方法來更新界面就會(huì)顯得列表卡頓,用戶體驗(yàn)不佳。
下面我們來介紹一下如何對(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è)可見item的position。
getLastVisiblePosition(),該方法獲取當(dāng)前狀態(tài)下list的最后一個(gè)可見item的position。
getItemAtPosition(int position),該方法返回當(dāng)前狀態(tài)下position位置上listView的convertView
ps:這里的convertView是復(fù)用的,也就是說不管position的值是多大(這個(gè)要看你整個(gè)list有多大),converView的個(gè)數(shù)應(yīng)該始終是屏幕上能顯示的list的條數(shù)那么多。
所 以,我們通過從getFirstVisiblePosition的值到getLastVisiblePosition的值之間的listitem和需要進(jìn) 行更新的條件(比如id)進(jìn)行比較確定哪一個(gè)是要更新的(如果不在當(dāng)前可是范圍內(nèi)也就沒有必要更新了,等list拉動(dòng)的時(shí)候自然就會(huì)更新出來)
代碼如下,其實(shí)這個(gè)方法是google 2011年開發(fā)者大會(huì)上提出的方法——ListView單條更新:
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; } } }
以上所述是小編給大家介紹的Android ListView 單條刷新方法實(shí)踐及原理解析,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Qt qml中l(wèi)istview 列表視圖控件(下拉刷新、上拉分頁、滾動(dòng)軸)
- Android UI設(shè)計(jì)系列之自定義ListView仿QQ空間阻尼下拉刷新和漸變菜單欄效果(8)
- Android仿XListView支持下拉刷新和上劃加載更多的自定義RecyclerView
- Android Listview上下拉動(dòng)刷新tab滑動(dòng)切換功能
- Android自定義控件開發(fā)實(shí)戰(zhàn)之實(shí)現(xiàn)ListView下拉刷新實(shí)例代碼
- Android實(shí)現(xiàn)上拉加載更多以及下拉刷新功能(ListView)
- Android開發(fā)之ListView實(shí)現(xiàn)Item局部刷新
- Android中ListView下拉刷新的實(shí)現(xiàn)方法實(shí)例分析
- Android開發(fā)之ListView列表刷新和加載更多實(shí)現(xiàn)方法
- android中ListView數(shù)據(jù)刷新時(shí)的同步方法
相關(guān)文章
Android進(jìn)程運(yùn)行中權(quán)限被收回導(dǎo)致關(guān)閉的問題解決
在Android開發(fā)中我們可能會(huì)遇到這樣的問題,進(jìn)程還在運(yùn)行著某些權(quán)限卻被收回了,這就導(dǎo)致進(jìn)程崩潰被迫關(guān)閉,本篇文章將帶你了解這個(gè)問題的發(fā)生與解決方法2021-10-10Flutter?SystemChrome控制應(yīng)用程序的系統(tǒng)級(jí)別行為
這篇文章主要為大家介紹了Flutter?SystemChrome用來控制應(yīng)用程序的系統(tǒng)級(jí)別行為步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Android7.0中關(guān)于ContentProvider組件詳解
本文描述了Android7.0中關(guān)于ContentProvider組件實(shí)現(xiàn)原理以及ContentProvider發(fā)布者和調(diào)用者這兩在Framework層是如何實(shí)現(xiàn)的。2017-11-11使用SignalR推送服務(wù)在Android的實(shí)現(xiàn) SignalA
SignalA是老外寫的用于實(shí)現(xiàn).net端推送消息至安卓端的實(shí)現(xiàn),支持版本為android 2.3或以上2014-07-07android設(shè)備不識(shí)別awk命令 缺少busybox怎么辦
這篇文章主要為大家詳細(xì)介紹了android設(shè)備不識(shí)別awk命令,缺少busybox的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Android自定義View實(shí)現(xiàn)多圖片選擇控件
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)多圖片選擇控件,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-08-08淺談Android textview文字對(duì)齊換行的問題
下面小編就為大家分享一篇淺談Android textview文字對(duì)齊換行的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android編程創(chuàng)建桌面快捷方式的常用方法小結(jié)【2種方法】
這篇文章主要介紹了Android編程創(chuàng)建桌面快捷方式的常用方法,結(jié)合實(shí)例形式總結(jié)分析了2種常見的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-02-02