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,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给 ...
随机推荐
- OAuth2.0 与 oauth2-server 库的使用
作者:baiyi链接:https://www.jianshu.com/p/83b0f6d82d6c來源:简书 OAuth2.0 是关于授权的开放网络标准,它允许用户已第三方应用获取该用户在某一网站的私 ...
- 第3章 Hadoop 2.x分布式集群搭建
目录 3.1 配置各节点SSH无密钥登录 1.将各节点的秘钥加入到同一个授权文件中 2.拷贝授权文件到各个节点 3.测试无秘钥登录 3.2 搭建Hadoop集群 1.上传Hadoop并解压 2.配置H ...
- Spark运行模式_Spark自带Cluster Manager的Standalone Client模式(集群)
终于说到了体现分布式计算价值的地方了! 和单机运行的模式不同,这里必须在执行应用程序前,先启动Spark的Master和Worker守护进程.不用启动Hadoop服务,除非你用到了HDFS的内容. 启 ...
- ruby配置镜像源
1.打开电脑的cmd窗口,输入如下命令即可查看gem镜像: gem sources l 或是直接使用 gem sources 查询结果如下: C:\Users\Administrator>gem ...
- 从零开始一个http服务器(三)-返回response 构造
从零开始一个http服务器(三) 代码地址 : https://github.com/flamedancer/cserver git checkout step3 运行: gcc request.h ...
- HDOJ:1533-Going Home(最小费用流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 解题心得: 第一次写最小费用流的题,去hdoj上找了一个入门级题目,建图比较简单,用了spfa和 ...
- Hihocoder #1515 : 分数调查
#1515 : 分数调查 http://hihocoder.com/problemset/problem/1515 分析 带权并查集. 如果把每个人抽象成一个点,之间的关系抽象成边.那么如果询问的两个 ...
- 3991: [SDOI2015]寻宝游戏
3991: [SDOI2015]寻宝游戏 https://www.lydsy.com/JudgeOnline/problem.php?id=3991 分析: 虚树+set. 要求树上许多点之间的路径的 ...
- Python:TypeError: 'range' object doesn't support item deletion
报错代码: dataIndex = range(m) del (dataIndex[randIndex]) 报错信息: 错误原因: python3 range返回的是range对象,不是数组对象 解决 ...
- 使用vs code写php及调试
原文来自:http://www.cnblogs.com/CLR010/p/5276077.html 首页先改下php.ini 一般是在最底部,有就修改没有就加上去下面的配置: xdebug.remot ...