Performance——layout相关

来源:互联网 发布:kk贴吧云签到源码 编辑:程序博客网 时间:2024/05/19 20:20

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;

}




原创粉丝点击