android ListView性能优化之路 -- 中级
这是一个典型的ListView,当然,不是那种demo级的简单布局。
优化中级:自身布局级优化
界面布局:系统在绘制一个界面的时候,需要知道知道各个元素之间的关系,所以有onMeasure(),一个简单的界面,在高手和初学者手里能表现出巨大的性能差距。
简单的例子就是上图的按钮,可以只用一个TextView来实现,也可以用一个Layout+ImageView+TextView来实现,性能可想而知。
ListView(包括像GridView),自身有着很强的定制性和适应性。它的布局相对于普通的View更为重要。ListView自身,尽可能的用FillParent,因为ListView绘制的时候,如果不知道自身的占位,那么在计算的时候,需要不停的getView来计算自身的长度和宽度,当然即使用了FillParent,它也要执行相当数量的getView来测算。
ItemView,因为使用频繁,所以它的每一点改进,都可能导致整体性能的显著提升。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="64dip" android:background="@color/_FFFAFAFA" > <TextView android:id="@+id/item_bg" android:layout_width="match_parent" android:layout_toLeftOf="@+id/item_theline" android:layout_height="64dip" android:background="@drawable/app_list_item_selector"/> <com.xunlei.appmarket.app.ui.ThumbnailImageView android:id="@+id/item_icon" android:contentDescription="@string/app_name" android:layout_width="48dip" android:layout_height="48dip" android:layout_centerVertical="true" android:layout_marginLeft="8dip"/> <TextView android:id="@+id/item_rightbtn" android:layout_width="64dip" android:layout_height="64dip" android:ellipsize="middle" android:layout_centerVertical="true" android:layout_alignParentRight="true" android:paddingTop="10dp" android:gravity="center" android:drawableTop="@drawable/download" android:text="@string/download" android:singleLine="true" android:textSize="12sp" android:background="@drawable/app_list_item_selector" android:textColor="@color/_FF777777" /> <ImageView android:id="@+id/item_theline" android:contentDescription="@null" android:layout_width="wrap_content" android:layout_height="48dip" android:layout_centerVertical="true" android:background="@drawable/list_item_divider" android:layout_toLeftOf="@+id/item_rightbtn"/> <RatingBar android:id="@+id/item_score" style="@style/myRatingBar" android:layout_toRightOf="@+id/item_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginTop="38dip" android:numStars="5" android:stepSize="0.1" /> <TextView android:id="@+id/item_appsize" android:layout_width="wrap_content" android:layout_height="20dip" android:layout_marginTop="15dip" android:layout_toLeftOf="@+id/item_theline" android:gravity="center_vertical" android:paddingRight="8dip" android:singleLine="true" android:text="@string/downloadsize" android:textColor="@color/_FF777777" android:textSize="12sp"/> <TextView android:id="@+id/item_downloadedcount" android:layout_width="wrap_content" android:layout_height="20dip" android:layout_marginTop="35dip" android:layout_toLeftOf="@+id/item_theline" android:gravity="center" android:paddingRight="8dip" android:singleLine="true" android:text="@string/downloadcount" android:textColor="@color/_FF777777" android:textSize="12sp" /> </RelativeLayout>
布局的优化原则就是尽量简单,层级尽量少。当然,如果你觉得加一些层级来增强代码可读性,那就智者见智了。
优化无止境,没有最好,只有更好,共勉之。