1,layout层级不要嵌套太深,嵌套层级深了加上使用layout_weight会显著降低performance,主要是影响measure时间
2,复用layout可以使用
<include layout="@layout/xxxx"
layout_width="match_parent"
layout_height="wrap_content" />
<include>中的属性可以重写xxx.xml中root元素的属性。
3,上面xxx.xml的root元素最好是<merge>,这样会减少layout的层级
4,只在必须要显示UI时才显示UI,可以使用<ViewStub>,它最初是不会被measure和render的。
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay" //最终会用这个layout代替这个ViewStub
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
可以通过setVisibility或者inflate方法让@layout/progress_overlay替代这个ViewStub
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
@layout/progress_overlay显示出来之后ViewStub就不复存在了,@layout/progress_overlay的root id变成android:inflatedId
5,对于LsitView或者GridView,会不停的call他们adapter的getView方法,而这个方法里面会findViewById,这样效率很低,可以使用ViewHolder来解决这个问题。
这样就不用每次都findViewById了
static class ViewHolder {
TextView text;
ImageView icon;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, parent, false);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text); //只在第一次创建View的时候findViewById
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}