转载至:https://www.cnblogs.com/wugu-ren/p/6106379.html

ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。
ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}
方法中进行的(要自定义listview都需要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。
getview的加载方法一般有以下三种种方式:
最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据
 1 public View getView(int position, View convertView, ViewGroup parent)
2 {
3 View item = mInflater.inflate(R.layout.list_item_icon_text,
4 null);
5 ((TextView)
6 item.findViewById(R.id.text)).setText(DATA[position]);
7 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
8 (position & 1) == 1 ? mIcon1 : mIcon2);
9 return item;
10 }

正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据

 1 public View getView(int position, View convertView, ViewGroup parent)
2 {
3 if (convertView == null) {
4 convertView = mInflater.inflate(R.layout.item, parent, false);
5 }
6 ((TextView)
7 convertView.findViewById(R.id.text)).setText(DATA[position]);
8 ((ImageView)
9 convertView.findViewById(R.id.icon)).setImageBitmap(
10 (position & 1) == 1 ? mIcon1 : mIcon2);
11 return convertView;
12 }

最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可

 1 static class ViewHolder {
2 TextView text;
3 ImageView icon;
4 }
5 public View getView(int position, View convertView, ViewGroup parent)
6 {
7 ViewHolder holder;
8 if (convertView == null) {
9 convertView = mInflater.inflate(R.layout.list_item_icon_text,
10 parent, false);
11 holder = new ViewHolder();
12 holder.text = (TextView) convertView.findViewById(R.id.text);
13 holder.icon = (ImageView) convertView.findViewById(R.id.icon);
14 convertView.setTag(holder);
15 } else {
16 holder = (ViewHolder) convertView.getTag();
17 }
18 holder.text.setText(DATA[position]);
19 holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 :
20 mIcon2);
21 return convertView;
22 }

最新文章

  1. Centos 7 使用jenkins 打包android项目
  2. 获取终端ip地址
  3. 2014鸟人Birdman中文字幕文件下载
  4. ASP.NET三层架构之不确定查询参数个数的查询
  5. 通过JDBC进行简单的增删改查(二)
  6. Android网络编程系列 一 Socket抽象层
  7. Unity3D ShaderLab 车辆喷漆光照模型实战
  8. Java学习笔记——JDK1.7的新特性。
  9. LNMP下防跨站、跨目录安全设置,仅支持PHP 5.3.3以上版本
  10. Webform——验证控件
  11. 吃了单片机GPIO端口工作模式的大亏 ——关于强推挽输出和准双向口(弱上拉)的实际应用
  12. 论山寨手机与Android联姻 【3】手机是怎样生产出来的
  13. Codeblocks快捷键
  14. java泛型类的继承规则
  15. MR-join连接1......
  16. 移动端弹出层加遮罩后禁止body滑动
  17. JMeter中BeanShell断言使用一
  18. mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引
  19. Installing Hyperledger Fabric v1.1 on Ubuntu 16.04 — Part II &  Part III
  20. HDUOJ---1233还是畅通工程

热门文章

  1. Python:PNG图像生成MP4
  2. JavaFx 监听剪切板实现(Kotlin)
  3. null与undefined到底有啥区别?
  4. cmd下载慢
  5. Editing Tools(编辑工具)
  6. java 文档自动生成的神器 idoc
  7. CSS绘制三角的小技巧
  8. 【Spring】IoC容器 - 依赖查找
  9. ORB_SLAM3 -- 配置安装
  10. UltraSoft - Beta - Scrum Meeting 1