android入门 — ListView的优化

ListView的运行效率是比较低的,因为在getView()中每次都会将整个布局重新加载一遍,当ListView快速滚动的时候就会成为性能瓶颈。
调用View中的findViewById()方法获取一次控件的实例,这也是一个很耗时的操作,可以进行优化。
方法一:convertView参数
这个参数用于将之前加载好的布局进行缓存,以便之后进行重用。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
{
convertView = inflater.inflate(R.layout.item, null);
}
ImageView logo = (ImageView)convertView.findViewById(R.id.logo);
TextView title = (TextView)convertView.findViewById(R.id.title);
TextView version = (TextView)convertView.findViewById(R.id.version);
TextView size = (TextView)convertView.findViewById(R.id.size); logo.setImageResource((Integer)list.get(position).get("logo"));
title.setText((String)list.get(position).get("title"));
version.setText((String)list.get(position).get("version"));
size.setText((String)list.get(position).get("size")); Button btn = (Button)convertView.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("dou", "点击");
}
});
return convertView;
}
使用这个参数用于将之前加载好的布局进行缓存,以便之后进行重用。
在getView()方法进行判断,如果为空,则使用LayoutInflater去加载布局,如果不为空,则直接对convertView进行重用,这样可以提高ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。
方法二:ViewHolder进行优化
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if(convertView == null)
{
convertView = inflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.logo = (ImageView)convertView.findViewById(R.id.logo);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.version = (TextView)convertView.findViewById(R.id.version);
holder.size = (TextView)convertView.findViewById(R.id.size);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder)convertView.getTag();
}
holder.logo.setImageResource((Integer)list.get(position).get("logo"));
holder.title.setText((String)list.get(position).get("title"));
holder.version.setText((String)list.get(position).get("version"));
holder.size.setText((String)list.get(position).get("size")); Button btn = (Button)convertView.findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("dou", "点击");
}
});
return convertView;
} class ViewHolder
{
ImageView logo;
TextView title;
TextView version;
TextView size;
}
当convertView为空的时候:创建一个ViewHolder对象,并将对象的实例都存放在ViewHolder中,然后调用setTag()方法,将ViewHoler对象存储在View中。
当convertView不为空的时候:调用View的getTag()方法,将ViewHolder重新取出来。
  
1.viewHolder是一个自定义的类,它存储了通过findViewById获取的空间对象;
2.当ConvertView被新建时,ViewHolder也随之一起缓存到Recycler中;
3.当ConvertView被重新利用的时候,ViewHolder也随之取出,从而可以直接给各个控件赋值,而无需再次调用findViewById方法。
结论:
无论总量是多少,findViewById方法最多可以调用N+1组(N为一屏可以显示的item的数量)
通过ViewHolder的方法,可以将所有的控件进行缓存,不需要每次通过findViewById来获取控件实例。

android入门 — ListView的优化的更多相关文章
- ym——Android之ListView性能优化
		
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...
 - Android之ListView性能优化——一行代码绑定数据——万能适配器
		
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
 - android入门 — ListView
		
ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎.今日头条.微博.通讯录等. ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中 ...
 - Android之ListView/GridView 优化
		
一.效率最低的getView实现 我们知道,ListView和GridView的显示都是通过Adapter的getView实现的. ListView/GridView数据量较小时,我们的处理方式一般是 ...
 - Android 开发ListView适配器优化
		
我们都知道Android中Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.想过没有? 在我们的列 ...
 - Android之ListView性能优化
		
ListView滚动速度优化主要可以应用以下几点方法来实现: 1.使用Adapter提供的convertView convertView是Adapter提供的视图缓存机制,当第一次显示数据的时候,ad ...
 - Android之ListView性能优化——使用ConvertView和ViewHolder
		
使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...
 - android入门 — ListView点击事件
		
listView中提供了两种点击事件的处理方法,分别是OnItemClick和OnItemLongClick. OnItemClick提供的是点击操作的处理,OnItemLongClick提供的是长按 ...
 - Android中ListView的优化
		
第一种方法 重用了convertView,很大程度上的减少了内存的消耗.通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给 ...
 
随机推荐
- 微信小程序车牌号码模拟键盘输入
			
微信小程序车牌号码模拟键盘输入练习, 未经允许,禁止转载,抄袭,如需借鉴参考等,请附上该文章连接. 相关资料参考:https://blog.csdn.net/littlerboss/article/d ...
 - ethereum(以太坊)(实例)--"安全的远程购买"
			
pragma solidity ^0.4.10; contract Safebuy{ uint public price; address public seller; address public ...
 - MapReduce序列化及分区的java代码示例
			
概述 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, ...
 - 剑指offer题目系列三(链表相关题目)
			
本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...
 - 【blockly教程】第三章Blockly顺序程序设计
			
3.1 什么是Blockly语言 2012年6月,Google发布了完全可视化的编程语言Google Blockly,整个界面清晰明了, 你可以如同在玩拼图一样用一块块图形对象构建出应用程序.每个图 ...
 - WebService第二天——WebService框架CXF
			
一.CXF 1.什么是CXF Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.CXF 继承 ...
 - 【caffe范例详解】 - 1.Classification分类
			
1. 安装 首先,导入numpy和matplotlib库 # numpy是常用的科学计算库,matplot是常用的绘图库 import numpy as np import matplotlib.py ...
 - hdu 2187(凸包直径 1.枚举 2.旋转卡壳)
			
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33115 Accepted: 10278 ...
 - OKVIS(一)初始化流程及代码结构
			
OKVIS代码结构: okvis_apps: your own app okvis_ceres: backend main code, estimator, error term; okvis_co ...
 - define的误用
			
#define LIGHT_SPEED 3e8 // m/sec (in a vacuum)