如何优化Android中的ListView?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
ListView的优化
对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式.
1.条目复用优化
详情见下图:
总结: 通过对上图的理解,那么我们得知listview的item是可以进行复用的,通过什么来复用?Android已经帮我们定义了一个方法getView(final int position, View convertView,ViewGroup parent) 里面的convertView 就是专门来处理复用的item的,因此我们只要对他处理就可以了.
2.优化findviewbyid
系统寻找子孩子id的方式: 从左向右,跟树状模式一样.
每次寻找子孩子都消耗很多的资源,但是子孩子的id都是被创建出来的,
也就是是说他们是固定的,竟然如此那么我们就可以对他进行优化;
系统找R.id的模式见下图:
总结: 通过对上图的理解,那么我们得知findviewbyid(id) 的底层操作太耗时了,如果一个布局里面有一百多层,那么我就单单是找一个小小的'ImageView' 都会找半天.幸好在2009年的google IO大会上,google的工程师推出了一个优化的方式 通过自定义一个viewholder类,来对view的id进行绑定,从而减少系统查找这样的耗时操作.
两种优化方案实际代码如下:
/**
* @param position 位置
* @param convertview 复用view
* 历史回收的view对象. 当某个view对象被完全移除屏幕的时候
* 1. 尽量的复用converview(历史缓存的view),减少view对象创建的个数
* 2. 尽量的减少子孩子id的查询次数 . 定义一个viewholder
*/
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View view;
ViewHolder holder;
if (convertView != null) {
// 复用历史view对象
view = convertView;
holder = (ViewHolder) view.getTag();
} else {
// 创建新的view对象
view = View.inflate(getApplicationContext(),
R.layout.item_callsmssafe, null);
// 每次寻找子孩子消耗很多的资源cpu 内存.
// 只有当子view对象第一次被创建的时候 查询id
holder = new ViewHolder();
holder.tv_mode = (TextView) view
.findViewById(R.id.tv_black_mode);
holder.tv_phone = (TextView) view
.findViewById(R.id.tv_black_phone);
holder.iv_delete_blacknumber = (ImageView) view
.findViewById(R.id.iv_delete_blacknumber);
view.setTag(holder);
}
/**
* 子孩子id的容器
*/
static class ViewHolder {
TextView tv_phone;
TextView tv_mode;
ImageView iv_delete_blacknumber;
}
看完上述内容,你们掌握如何优化Android中的ListView的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。