提升ListView的运行效率和ListView的其他属性
2015-08-25 18:10
337 查看
提升ListView的运行效率
这里用到了两个参数 一个是convertView,另一个是ViewHolder,其实ViewHolder并不是一个参数。public View getView(int position, View convertView, ViewGroup parent) { //使用inflate方法来载入layout的xml View view=mInflater.inflate(R.layout.activity_simplelist,null); Student student=mData.get(position); TextView textView_name= (TextView) view.findViewById(R.id.text_name); TextView textView_age= (TextView) view.findViewById(R.id.text_age); TextView textView_sex= (TextView) view.findViewById(R.id.text_sex); TextView textView_hobby= (TextView) view.findViewById(R.id.text_hobby); textView_name.setText(student.getName()); textView_age.setText(student.getAge()); textView_sex.setText(student.getSex()); textView_hobby.setText(student.getHobby()); return view; }
在上边的代码中,每次都将布局重新加载了一遍,在ListView快速滚动的时候就会成为性能的瓶颈。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View。这时候就用到了convertView,convertView这个参数是用来将之前加载好的布局进行缓存,以便之后可以进行重用。除此之外,findViewById()方法会每次都去获取一次控件的实例。在这里可以用一个ViewHolder来对这部分的性能进行优化。
public View getView(final int position, View convertView, ViewGroup parent) { //使用inflate方法来载入layout的xml Student student = mData.get(position); ViewHolder viewHolder; if (convertView == null) { convertView = mInflater.inflate(R.layout.activity_simplelist, null); viewHolder=new ViewHolder(); viewHolder.textView_name = (TextView)convertView.findViewById(R.id.text_name); viewHolder.textView_age = (TextView) convertView.findViewById(R.id.text_age); viewHolder.textView_sex = (TextView) convertView.findViewById(R.id.text_sex); viewHolder.textView_hobby = (TextView) convertView.findViewById(R.id.text_hobby); viewHolder.imageView_photo= (ImageView) convertView.findViewById(R.id.imageview_photo); viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox); convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.textView_name.setText(student.getName()); viewHolder.textView_age.setText(student.getAge()); viewHolder.textView_sex.setText(student.getSex()); viewHolder.textView_hobby.setText(student.getHobby()); viewHolder.imageView_photo.setImageResource(student.getImg()); return convertView; } class ViewHolder{ TextView textView_name; TextView textView_age; TextView textView_sex; TextView textView_hobby; ImageView imageView_photo; CheckBox checkBox; }
在上边的代码中,在getView()方法中进行了判断,如果conVertView为空,则用LayoutInflater去加载布局,如果不为空则直接对convertView进行重用。另外新增了一个内部类ViewHolder,用于对空间的实例进行缓存。当conVertView为空的时候,会创建一个ViewHolder对象,并将空间的实例都存放在ViewHolder中,然后调用setTag()方法,将ViewHolder对象存储在conVertView中,conVertView不为空的时候调用getTag()方法吧ViewHolder重新取出。
相关文章推荐
- 如何编辑SDE数据库
- JSP+Servlet + JDBC 实现简单的登录验证模块
- 备忘篇——正则表达式集合
- 【转】文件恢复神器extundelete
- 黑马程序员——Collection
- python BDD 框架之lettuce(支持中文)
- 压缩图片实例
- Linux操作系统日志中常用的搜索关键字
- angularJs学习笔记
- Android Toolbar样式定制详解
- django RESTful研究一第一个测试例子(用序列化器编写原生的Django视图函数)
- sscanf
- 使用 Sahi 实现 Web 自动化测试
- java进行多张图片组合一张图片
- 在cocos2dx中实现水波滤镜 .
- 各类排序算法性能对比简述
- EdtText默认显示数字键盘,不强制输入数字
- eclipse工具栏sdk和avd图标
- 百度地图 - demo
- atitit.jquery tmpl模板总结 .doc