呂海洋 劉忠利 劉競男
【摘 要】Android系統(tǒng)開發(fā)是目前移動互聯(lián)開發(fā)的主流系統(tǒng),相對于計算機開發(fā),其內(nèi)存小、屏幕小,所以,對應(yīng)用程序的性能有特別高的要求。ListView是android開發(fā)中最重要的控件之一,使用頻率特別高,幾乎每個項目中都需要使用ListView控件實現(xiàn)列表顯示,因此,提高ListView控件的性能對整個項目的質(zhì)量及用戶體驗至關(guān)重要,本文分析了ListView控件的實現(xiàn)原理,著重對其性能進行優(yōu)化。
【關(guān)鍵字】Android開發(fā) ListView 性能優(yōu)化
一、引言
ListView控件是Android控件中使用最廣泛的控件之一,在程序加載過程中,如果數(shù)據(jù)較大容易出現(xiàn)白屏,等待時間較長,占用較大內(nèi)存甚至出現(xiàn)ANR(Application Not Responding)異常等問題;如果應(yīng)用程序連接網(wǎng)絡(luò)會浪費用戶流量。為了解決該控件中出現(xiàn)的一系列問題,提高ListView的性能進行優(yōu)化。
二、ListView原理與分析
(一)LsitView顯示的基本原理
List控件如果要顯示數(shù)據(jù)需要具備以下元素:ListView列表控件,數(shù)據(jù)適配器,布局文件,數(shù)據(jù)。四者的關(guān)系如下圖1所示。其中,ListView是基本的顯示控件,以列表的形式顯示數(shù)據(jù)信息,XML布局文件定義了ListView控件中每個item項包含的控件及布局格式,數(shù)據(jù)可以是數(shù)組、List集合等,存放要顯示的TextView、ImageView等控件的數(shù)據(jù)信息,Adapter為適配器將數(shù)據(jù)按照xml布局文件的格式顯示在List控件之中。
(二)BaseAdapter的原理
BaseAdaper是基本數(shù)據(jù)適配器,將數(shù)據(jù)資源按照布局文件格式填充到ListView控件,其中有相應(yīng)的重寫方法,用于顯示每項內(nèi)容的是public void getView(int Position, View convertView,ViewGroup parent){ }
圖1 ListView應(yīng)用關(guān)系圖
在圖1中,數(shù)據(jù)和xml布局文件是已定義好的內(nèi)容,不可以改變。如果提高ListView的性能,只有對Adaper的優(yōu)化,重點是getView的設(shè)計。重點分析getView的設(shè)計中占用內(nèi)存的關(guān)鍵環(huán)節(jié)所在。
三、分析問題
造成數(shù)據(jù)加載時間較長以及占用內(nèi)存的主要問題是在getView方法中的兩項主要操作占用了系統(tǒng)內(nèi)存。第一,對于列表顯示的每一項內(nèi)容,都需要加載其布局文件(假設(shè)布局文件為item.xml)。即View view = Inflater.inflate(R.layout.item1,null);第二,對于每一項中的各種控件都需要進行查找(假設(shè)只有TextView控件)。
基于以上兩點,如果數(shù)據(jù)內(nèi)容較大會占用較大內(nèi)存,影響數(shù)據(jù)加載及顯示效果。
四、性能優(yōu)化方案
為了解決以上問題,可以采取以下優(yōu)化方案。
(一)利用convertView的復(fù)用,減少創(chuàng)建view的次數(shù)。
在ListView中,并不能顯示全部數(shù)據(jù),只是按照屏幕可以容納的最大項目顯示列表項,對于每個顯示項都需要調(diào)用getView()方法?;瑒舆^程中一定是有項進入,有項目退出。退出的項將保存在convertView項,因此新項目可以利用convertView,省略使用inflater方法加載布局文件。每次首先判斷convertView是否為空,如果空,我們創(chuàng)建新的convertView;如果不為空,直接利用convertView創(chuàng)建view。不用再次填充布局,能夠節(jié)省大量內(nèi)存,效率可以提高200%左右。
(二)創(chuàng)建ViewHolder類,減少findbyId的次數(shù)。
加入的每一項,具有相同的控件。每個控件需要在布局文件中找到相應(yīng)的控件并為其設(shè)定內(nèi)容。為了減少每次加載一些都需要到布局文件中查找每個控件,可以定義一個Viewholder類,為每項創(chuàng)建一個holder對象,將所有控件保持在holder中,并且通過setTag標(biāo)簽進行查找,減少查找控件的次數(shù),效率可以再提高50%。
(三)優(yōu)化代碼
1.Public View getView(int position, View convertView, ViewGroup parent) {
2.ViewHolder holder=null;
3.if(convertView==null){ //如果為空,需要填充布局文件
4.convertView=mInflater.inflate(R.layout.item1,null);
5.holder=new ViewHolder();
6.holder.textView=(TextView)convertView.findViewById(R.id.text);
7.convertView.setTag(holder);
8.}else {
9.Holder = (ViewHolder)convertView.getTag();
10.}
11.holder.textView.setText(mData.get(position));
12.return convertView;
13.}
14.}
15.Public class ViewHolder{
16.Public TextView textView;
17.}
五、結(jié)論
通過對ListView的優(yōu)化,可以有效的提高顯示效果及加載速度,同時提高用戶體驗效果。如果進行大量數(shù)據(jù)加載,可以對較大數(shù)據(jù)采取分頁方式加載,如果對于加載網(wǎng)絡(luò)資源,可以采取異步方式。
參考文獻:
[1]關(guān)于ListView控件優(yōu)化方案的研究與實現(xiàn) ,Computer Era 2012,沈潔等.
[2]Donet框架控件ListView的排序研究,冶金自動化 2008,衛(wèi)萬勇.