肥城贴吧,井琳,义乌头饰批发
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 studio开发小型对话机器人app(实例代码)
Android通过Java sdk的方式接入OpenCv的方法
Android 通过cmake的方式接入opencv的方法步骤
Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)
网友评论