关闭

Performance——layout相关

656人阅读 评论(0) 收藏 举报
分类:

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;

}




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26358次
    • 积分:524
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论