Android ListView 的优化
一、復(fù)用convertView。降低findViewById的次數(shù)
1、優(yōu)化一:復(fù)用convertView
Android系統(tǒng)本身為我們考慮了ListView的優(yōu)化問題,在復(fù)寫的Adapter的類中。比較重要的兩個(gè)方法是getCount()和getView()。
界面上有多少個(gè)條顯示,就會(huì)調(diào)用多少次的getView()方法;因此假設(shè)在每次調(diào)用的時(shí)候,假設(shè)不進(jìn)行優(yōu)化。每次都會(huì)使用View.inflate(….)的方法,都要將xml文件解析,并顯示到界面上。這是很消耗資源的:由于有新的內(nèi)容產(chǎn)生就會(huì)有舊的內(nèi)容銷毀。所以,能夠復(fù)用舊的內(nèi)容。
優(yōu)化:
在getView()方法中,系統(tǒng)就為我們提供了一個(gè)復(fù)用view的歷史緩存對(duì)象convertView,當(dāng)顯示第一屏的時(shí)候,每個(gè)item都會(huì)新創(chuàng)建一個(gè)view對(duì)象,這些view都是能夠被復(fù)用的。假設(shè)每次顯示一個(gè)view都要?jiǎng)?chuàng)建一個(gè),是很耗費(fèi)內(nèi)存的;所以為了節(jié)約內(nèi)存,能夠在convertView不為null的時(shí)候,對(duì)其進(jìn)行復(fù)用
2、優(yōu)化二:緩存item條目的引用——ViewHolder
??? findViewById()這種方法是比較耗性能的操作。由于這種方法要找到指定的布局文件。進(jìn)行不斷地解析每一個(gè)節(jié)點(diǎn):從最頂端的節(jié)點(diǎn)進(jìn)行一層一層的解析查詢。找到后在一層一層的返回。假設(shè)在左邊沒找到,就會(huì)接著解析右邊。并進(jìn)行對(duì)應(yīng)的查詢。直到找到位置(如圖)。因此能夠?qū)indViewById進(jìn)行優(yōu)化處理,須要注意的是:
》》》》特點(diǎn):xml文件被解析的時(shí)候。僅僅要被創(chuàng)建出來了,其孩子的id就不會(huì)改變了。依據(jù)這個(gè)特點(diǎn)。能夠?qū)⒑⒆觟d存入到指定的集合中,每次就能夠直接取出集合中相應(yīng)的元素就能夠了。
優(yōu)化:
在創(chuàng)建view對(duì)象的時(shí)候,降低布局文件轉(zhuǎn)化成view對(duì)象的次數(shù);即在創(chuàng)建view對(duì)象的時(shí)候。把所有孩子所有找到,并把孩子的引用給存起來
①定義存儲(chǔ)控件引用的類ViewHolder
這里的ViewHolder類須要不須要定義成static。依據(jù)實(shí)際情況而定,假設(shè)item不是非常多的話。能夠使用。這樣在初始化的時(shí)候。僅僅載入一次。能夠略微得到一些優(yōu)化
只是,假設(shè)item過多的話,建議不要使用。由于static是Java中的一個(gè)keyword。當(dāng)用它來修飾成員變量時(shí),那么該變量就屬于該類。而不是該類的實(shí)例。所以用static修飾的變量。它的生命周期是非常長(zhǎng)的,假設(shè)用它來引用一些資源耗費(fèi)過多的實(shí)例(比方Context的情況最多),這時(shí)就要盡量避免使用了。
??? class ViewHolder{
??? ???????? ???????? //定義item中對(duì)應(yīng)的控件
??? ???????? }
②創(chuàng)建自己定義的類:ViewHolder holder = null;
③將子view加入到holder中:
在創(chuàng)建新的listView的時(shí)候,創(chuàng)建新的ViewHolder,把所有孩子所有找到,并把孩子的引用給存起來
通過view.setTag(holder)將引用設(shè)置到view中
通過holder,將孩子view設(shè)置到此holder中,從而降低以后查詢的次數(shù)
④在復(fù)用listView中的條目的時(shí)候。通過view.getTag()。將view對(duì)象轉(zhuǎn)化為holder,即轉(zhuǎn)化成對(duì)應(yīng)的引用,方便在下次使用的時(shí)候存入集合。
? 通過view.getTag(holder)獲取引用(須要強(qiáng)轉(zhuǎn))
二、ListView中數(shù)據(jù)的分批及分頁載入:
需求:ListView有一萬條數(shù)據(jù)。怎樣顯示;假設(shè)將十萬條數(shù)據(jù)載入到內(nèi)存,非常消耗內(nèi)存
解決的方法:
優(yōu)化查詢的數(shù)據(jù):先獲取幾條數(shù)據(jù)顯示到界面上
進(jìn)行分批處理---à優(yōu)化了用戶體驗(yàn)
進(jìn)行分頁處理---à優(yōu)化了內(nèi)存空間
說明:
一般數(shù)據(jù)都是從數(shù)據(jù)庫(kù)中獲取的,實(shí)現(xiàn)分批(分頁)載入數(shù)據(jù),就須要在相應(yīng)的DAO中有相應(yīng)的分批(分頁)獲取數(shù)據(jù)的方法,如findPartDatas ()
1、準(zhǔn)備數(shù)據(jù):
??? 在dao中加入分批載入數(shù)據(jù)的方法:findPartDatas ()
??? 在適配數(shù)據(jù)的時(shí)候,先載入第一批的數(shù)據(jù),須要載入第二批的時(shí)候,設(shè)置監(jiān)聽檢測(cè)何時(shí)載入第二批
2、設(shè)置ListView的滾動(dòng)監(jiān)聽器:setOnScrollListener(new OnScrollListener{….})
①、在監(jiān)聽器中有兩個(gè)方法:滾動(dòng)狀態(tài)發(fā)生變化的方法(onScrollStateChanged)和listView被滾動(dòng)時(shí)調(diào)用的方法(onScroll)
②、在滾動(dòng)狀態(tài)發(fā)生改變的方法中,有三種狀態(tài):
手指按下移動(dòng)的狀態(tài):??????? ???????? ???????? SCROLL_STATE_TOUCH_SCROLL:// 觸摸滑動(dòng)
慣性滾動(dòng)(滑翔(flgin)狀態(tài)):?? SCROLL_STATE_FLING: // 滑翔
精巧狀態(tài):????? ???????? ???????? ???????? ???????? SCROLL_STATE_IDLE:// 精巧
3、對(duì)不同的狀態(tài)進(jìn)行處理:
分批載入數(shù)據(jù),僅僅關(guān)心精巧狀態(tài):關(guān)心最后一個(gè)可見的條目,假設(shè)最后一個(gè)可見條目就是數(shù)據(jù)適配器(集合)里的最后一個(gè),此時(shí)可載入很多其它的數(shù)據(jù)。在每次載入的時(shí)候,計(jì)算出滾動(dòng)的數(shù)量,當(dāng)滾動(dòng)的數(shù)量大于等于總數(shù)量的時(shí)候。能夠提示用戶無很多其它數(shù)據(jù)了。
轉(zhuǎn)載于:https://www.cnblogs.com/wzjhoutai/p/6885776.html
總結(jié)
以上是生活随笔為你收集整理的Android ListView 的优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20155330 实验四 Android
- 下一篇: 河南省第十届省赛 Plumbing