ListView常见的优化方式简述
ListView的优化
对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式.
1.条目复用优化
其实listview的工作原理就是,listview在请求屏幕可见的item数时,convertView在getVIew中是null 的.
但是当屏幕向下滑动的时候(比如该屏幕尺寸可显示7条teim),在item1被隐藏,此时出现item8时,covertView的值就不为null 了,因为item1去填充它.
而如果不做复用处理的话,item8 则会继续去findviewById, 因此其实每个item里的View控件,竟然ID都是一样的,那我们其实可以利用covertView的复用原理,来优化listview,从而避免OOM异常.
详情见下图:
总结: 通过对上图的理解,那么我们得知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;
}
ListView常见的优化方式简述的更多相关文章
- Android开发中常用的ListView列表的优化方式ViewHolder
在Android开发中难免会遇到大量的数据加载到ListView中进行显示, 然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需 求变化ListView'条目中的内容是越来越多这就 ...
- web开发常见性能优化方式
经常使用的高并发. 高性能web,数据库server. 1.html 静态化 : 如新闻频道更新的非常快,都是通过cms静态生成(门户,信息公布类型的站点,交互性高的如猫扑的大杂烩也是静态化,实时静 ...
- Android中ListView的几种常见的优化方法
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...
- 常见 Web 性能优化方式
这篇文章是我阅读 Web Performance 101 之后的进行的粗糙的翻译作为笔记,英语还行的童鞋可以直接看原文. 这篇文章主要介绍了现代 web 加载性能(注意不涉及代码算法等),学习为什么加 ...
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
C#不用union,而是有更好的方式实现 用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...
- ListView复用和优化详解
我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率,而内部实现的一种优化,牺牲一点内存.而 ...
- 常见性能优化策略的总结 good
阅读目录 代码 数据库 缓存 异步 NoSQL JVM调优 多线程与分布式 度量系统(监控.报警.服务依赖管理) 案例一:商家与控制区关系的刷新job 案例二:POI缓存设计与实现 案例三:业务运营后 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- Oracle 优化方式
Oracle的优化器有两种优化方式,即基于规则的优化方式(rule-based optimization 简称RBO)和基于代价的优化方式(cost-based optimization 简称CBO) ...
随机推荐
- vscode设置出错, 无法自动补全
问题: 之前设置的没问题, vscode重装后, 发现vscode里面的设置还在, 但敲代码却无法识别虚拟环境中的包了, 因此相关的内容也无法自动补全. 解决: 后来发现, 实际上设置没有出错, 但重 ...
- zookeeper初探
安装三台linux虚拟机,安装好java环境,并配置好网络以及host文件,分别改好hostname为node0.node1.node2 上传下载好的zookeeper文件到node0的/usr/lo ...
- JAVA_将唐诗按照古文样式输出
1. 如有唐诗: 锄禾日当午 汗滴禾下土 谁知盘中餐 粒粒皆辛苦 要求将这首唐诗按照古文样式输出,输出格式如下: 粒谁汗锄 粒知滴禾 皆盘禾日 辛中下当 苦餐土午 public class Text ...
- Bank方案SQL
用于演示的Bank方案对应的SQL: /* 1.branch 开展银行交易业务的场所 */ DROP TABLE IF EXISTS branch; CREATE TABLE branch -- 开展 ...
- django实现model中choices类型字段,后台自由配置
该功能主要试用于项目中有大量需要动态配置的字典字段,字典建议做缓存处理. 定义字典类型表,字典值两张表 2.配置对应的字典值 3.重写model的init方法,动态赋值choice 4.列表界面效果 ...
- Node.js系列文章:如何进行代码调试
使用任何一门编程语言,都少不了代码调试这一功能.我们在使用JavaScript编写浏览器端代码时,Chrome提供了强大的调试工具Dev Tools,但是在编写Node.js代码时,大多数人最开始都使 ...
- Mysql之单表记录查询
数据记录查询: 1.简单数据记录查询: select * from table_name; select allfield from table_name; select distinct(属性名) ...
- ●SPOJ 8222 NSUBSTR–Substrings
题链: http://www.spoj.com/problems/NSUBSTR/题解: 后缀自动机. 不难发现,对于自动机里面的一个状态s, 如果其允许的最大长度为maxs[s],其right集合的 ...
- UVALive - 3882:And Then There Was One
约瑟夫环 f[i]表示有i个人先处理第k个人,最后被处理的人是谁 #include<cstdio> #include<cstdlib> #include<algorith ...
- bzoj 2212: [Poi2011]Tree Rotations
Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...