Listview优化之convertView,viewHolder

2024-05-25 19:48

本文主要是介绍Listview优化之convertView,viewHolder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,本文中的代码来自《第一行代码》

参考链接:http://blog.csdn.net/pkxiuluo01/article/details/7380974
http://blog.csdn.net/kongzhichen/article/details/10721197
http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

使用convertView,viewHolder来优化Listview都是针对Adapter中的getView()方法来优化的

下面这个是没有优化的getView()方法

 public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public FruitAdapter(Context context, int textViewResourceId,List<Fruit> objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}@Override
public View getView(int position, View convertView, ViewGroup parent) 
{ Fruit fruit = getItem(position); // 获取当前项的Fruit实例View view=LayoutInflater.from(getContext()).inflate(resourceId, null);ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId());    fruitName.setText(fruit.getName());return view;}
}

这是listview的每个Item的结构

优化点1:
这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存。
(没有复用,导致每次使用都要创建)
优化点2:
创建View对象View view=LayoutInflater.from(getContext()).inflate(resourceId, null);
从xml中生成View,这是属于IO操作也是耗时操作,所以必将影响性能。
优化点3:
加载ListItem中的TextView,ImageView(就本例来说)

convertView可以解决1和2
ViewHolder可以解决3

这是Recycler内部原理图

Android提供了一个叫做Recycler(反复循环器)的构件,
就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓
存到Recycler中,相应的会从下方生成一个Item,
而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说
如果能重用这个convertView,就会大大改善性能。

public class FruitAdapter extends ArrayAdapter<Fruit> {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {   Fruit fruit = getItem(position);View view;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resourceId, null);} else {view = convertView;}ImageView fruitImage = (ImageView)   view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName());return view;}
}

使用convertView优化之后
可以看到,现在我们在 getView()方法中进行了判断,
1.如果 convertView 为空,则使用 LayoutInflater 去加载布局,
2.如果不为空则直接对 convertView 进行重用。
(已经创建的View对象可以直接复用)
(对xml文件中的Layout——转化——>View对象 这个过程进行优化,不用重复加载布局文件)

这样就大大提高了 ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。

现在开始使用ViewHolder进行优化

虽然现在已经不会再重复去加载布局,但是每次在 getView()方法中还是会调用 View 的 findViewById()方法来获取一次控件的实例。 我们可以借助一个 ViewHolder 来对这部分性能进行优化,修改 FruitAdapter 中的代码,如下

public class FruitAdapter extends ArrayAdapter<Fruit> {@Overridepublic View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position);View view;ViewHolder viewHolder;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resourceId, null);//添加ViewHolderviewHolder = new ViewHolder();viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);//将ImageView,TextView控件保存在ViewHolder中view.setTag(viewHolder); // 将ViewHolder存储在View中//setTag是用来给 view添加附加信息的  //详见 http://blog.csdn.net/pkxiuluo01/article/details/7380874} else {view = convertView;viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());//在这里我们将存放在ViewHolder中的ImageView,TextView实例拿出来使用,而不是findviewById重新创建return view;}class ViewHolder { ImageView fruitImage;TextView fruitName;}
}

我们新增了一个内部类 ViewHolder,用于对控件的实例进行缓存。当 convertView 为空 的时候,创建一个 ViewHolder 对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View 的 setTag()方法,将 ViewHolder 对象存储在 View 中。当 convertView 不为空的时候则调用 View 的 getTag()方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder 里,就没有必要每次都通过 findViewById()方法来获取控件实例了。

setTag和getTag的用法
view的setTag和getTag方法其实很简单,在实际编写代码的时候一个view不仅仅是为了显示一些字符串、图片,有时我们还需要他们携带一些其他的数据以便我们对该view的识别或者其他操作。于是android 的设计者们就创造了setTag(Object)方法来存放一些数据和view绑定,我们可以理解为这个是view 的标签也可以理解为view 作为一个容器存放了一些数据。而这些数据我们也可以通过getTag() 方法来取出来。
到这里setTag和getTag大家应该已经明白了。再回到上面的话题,我们通过convertview的setTag方法和getTag方法来将我们要显示的数据来绑定在convertview上。如果convertview 是第一次展示我们就创建新的Holder对象与之绑定,并在最后通过return convertview 返回,去显示;如果convertview 是回收来的那么我们就不必创建新的holder对象,只需要把原来的绑定的holder取出加上新的数据就行了。

这篇关于Listview优化之convertView,viewHolder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1002460

相关文章

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器