新聞中心
在看了一些vogella的文章之后,發(fā)現(xiàn)關(guān)于android listview性能優(yōu)化這一段很有意思,于是實(shí)踐了一下,經(jīng)過優(yōu)化,性能確實(shí)提升不少!

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比紅橋網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式紅橋網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋紅橋地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
先看看優(yōu)化前和優(yōu)化后的比較:
優(yōu)化前的log截圖:
優(yōu)化后的log截圖:
并且,在不停滾動(dòng)ListView的過程中,優(yōu)化之前會(huì)出現(xiàn)ANR現(xiàn)象,在AVD上特別容易復(fù)現(xiàn):
然后,優(yōu)化后顯得很流暢,附上對(duì)于的log截圖:
下面附上相關(guān)代碼分析:
ListView中的每一個(gè)Item由一個(gè)ImageView 和一個(gè)TextView組成
Layout:
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="horizontal" >
- android:layout_width="wrap_content"
- android:layout_height="fill_parent" />"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:layout_marginLeft="15dp"
- android:gravity="center_vertical" />
Activity繼承自ListActivity,我故意增加了Item,方便測(cè)試,效果更明顯:
- public class ListViewDemo extends ListActivity{
- private final String[] mItems = new String[] { "Android", "iPhone",
- "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
- "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu",
- "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7",
- "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X",
- "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ListViewArrayAdapter adapter = new ListViewArrayAdapter(this, mItems);
- getListView().setAdapter(adapter);
- }
- }
然后custom Adapter,優(yōu)化之前的adapter:
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- long start = System.currentTimeMillis();
- LayoutInflater inflater = (LayoutInflater) mContext.getLayoutInflater();
- View rowView = inflater.inflate(mViewResourceId, parent, false);
- TextView textView = (TextView) rowView
- .findViewById(mTextViewResourceId);
- ImageView imageView = (ImageView) rowView
- .findViewById(mImageViewResourceId);
- textView.setText(mNames[position]);
- String s = mNames[position];
- if (s.startsWith("Windows7") || s.startsWith("iPhone")) {
- imageView.setImageResource(R.drawable.no);
- } else {
- imageView.setImageResource(R.drawable.yes);
- }
- Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start));
- return rowView;
- }
優(yōu)化之后的Adapter:
- public class ListViewArrayAdapter extends ArrayAdapter
{ - private final Activity mContext;
- private final String[] mNames;
- private final static int mViewResourceId = R.layout.text_image_row_layout;
- private final static int mTextViewResourceId = R.id.textView;
- private final static int mImageViewResourceId = R.id.imageView;
- static class ViewHolder {
- public TextView text;
- public ImageView image;
- }
- public ListViewArrayAdapter(Activity context, String[] names) {
- super(context, mViewResourceId, names);
- this.mContext = context;
- this.mNames = names;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- long start = System.currentTimeMillis();
- View rowView = convertView;
- if (rowView == null) {
- LayoutInflater inflater = mContext.getLayoutInflater();
- rowView = inflater.inflate(mViewResourceId, null);
- ViewHolder viewHolder = new ViewHolder();
- viewHolder.text = (TextView) rowView.findViewById(mTextViewResourceId);
- viewHolder.image = (ImageView) rowView.findViewById(mImageViewResourceId);
- rowView.setTag(viewHolder);
- }
- ViewHolder holder = (ViewHolder) rowView.getTag();
- String s = mNames[position];
- holder.text.setText(s);
- if (s.startsWith("Windows7") || s.startsWith("iPhone")) {
- holder.image.setImageResource(R.drawable.no);
- } else {
- holder.image.setImageResource(R.drawable.yes);
- }
- Log.v("jerikc","cost time = " + (System.currentTimeMillis() - start));
- return rowView;
- }
- }
優(yōu)化的大致思想就是:優(yōu)化之前,每次加載item的時(shí)候,都要加載一下布局文件,然后生成一個(gè)新的row View對(duì)象,然后通過View找到對(duì)應(yīng)的ImageView和TextView,正如我們所知道的那樣,加載布局文件時(shí)很耗時(shí)的,特別是在操作比較頻繁 情況下,這是不可忍受的,所以會(huì)導(dǎo)致ANR現(xiàn)象。
因此,我們可以重復(fù)利用已不可見的row View對(duì)象。Android中,當(dāng)它決定讓row View對(duì)象不可見的時(shí)候,它允許通過getView方法中的convertView參數(shù)來重復(fù)利用剛剛不可見的row View對(duì)象。
在優(yōu)化的過程中,第一次加載的時(shí)候,我們需要把相關(guān)的數(shù)據(jù)保存起來,而View有一個(gè)方法setTag,該方法可用來保存一些數(shù)據(jù)結(jié)構(gòu)。我們一個(gè)row View對(duì)象是由ImageView和TextView空間組成的,因此定義一個(gè)ViewHolder來保存ImageView和TextView對(duì)象。 在重復(fù)利用的過程中,只需簡(jiǎn)單修改它們的值,而不用再次findViewById。
當(dāng)前題目:Android優(yōu)化ListView實(shí)踐
文章位置:http://www.dlmjj.cn/article/dpphpse.html


咨詢
建站咨詢
