ListView优化

一、ListView简单优化

复用view的历史缓存对象

实例代码:

  1. public View getView(init position,View convertView,ViewGroup parent){
  2. View view;
  3. if(convertView!=null){
  4. view=convertView;
  5. }else{
  6. //创建新的view对象
  7. view=View.inflate(BlackNumberActivity.this,R.layout.black_number_item,null);
  8. }
  9. TextView tv=(TextView)findViewById(R.id.tv);//找到条目上的TextView控件
  10. }

二、ListView深度优化

原理:上面的优化方法中虽然将第一屏的view对象复用了历史缓存对象convertView,但是发现每次解析布局文件找到条目上的控件(即findViewById(R.id.tv))的时候很耗费资源

(注:找控件上的控件的过程就是解析xml文件,每调用一次findViewById就会在内存中解析一次xml文件所以比较耗费资源)

为了解决以上问题,我们可以这样做,定义一个静态内部类,随着外部类的加载该静态内部类里面的变量已加载到内存中,在加载第一屏条目的时候,就在内存中创建与屏幕上所能容纳的条目数量相同的对象,并且用setTag方法与条目上的控件绑定,这样条目上的控件就存储在第一次加载的时候存储在缓冲中,当复用历史缓存对象covertView的时候就不用再去解析xml文件了,这样就提高了效率节约了资源

1、定义一个容器,代码实现如下:

  1. static class ViewHolder{
  2. TextView tv_number;
  3. TextView tv_mode;
  4. }

2、当创建View的时候实例化容器

  1. ViewHolder holder;
  2. if(convertView!=null){
  3. view=convertView;
  4. holder=(ViewHolder)view.getTag();
  5. }else{
  6. //初始化容器
  7. holder=new ViewHolder();
  8. //设置该视图相关联的标记。一个标签可以用来标记一个视图层次结构
  9. //和层次结构内不必是唯一的。标签也可以用来存储数据在一个视图没有求助于另一个数据结构
  10. view.setTag(holder);
  11. }

3、使用

  1. holder.tv_number.setText(info.getNumber());
  2. if("1".equals(info.getMode())){
  3. holder.tv_mode.setText("拦截电话");
  4. }else if("2".equals(info.getMOde())){
  5. holder.tv_mode.setText("拦截短信");
  6. }else if("3".equals(info.getMode())){
  7. holder.tv_mode.setText("拦截电话+短信");
  8. }

综合使用:

  1. private class MyAdapter extends BaseAdapter {
  2. @Override
  3. public int getCount() {
  4. return list.size();
  5. }
  6. /**
  7. * convertView 缓存的view对象
  8. */
  9. @Override
  10. public View getView(final int position, View convertView, ViewGroup parent) {
  11. View view;
  12. ViewHolder holder = null;
  13. if (convertView != null) {
  14. view = convertView;
  15. // 从历史缓存的view中得到holder
  16. holder = (ViewHolder) view.getTag();
  17. Log.e(TAG, "===============历史缓存的view :" + position);
  18. } else {
  19. holder = new ViewHolder();
  20. view = View.inflate(BlackNumberActivity.this,
  21. R.layout.black_number_item, null);
  22. Log.e(TAG, "==========新建的view :" + position);
  23. // 把从view中得到的三个控件防盗holder中,就相当于缓存起来了
  24. holder.tv_number = (TextView) view.findViewById(R.id.tv_number);
  25. holder.tv_mode = (TextView) view.findViewById(R.id.tv_mode);
  26. holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
  27. // 把holder绑定给 view对象
  28. view.setTag(holder);
  29. }
  30. final BlackNumberInfo info = list.get(position);
  31. holder.iv_delete.setOnClickListener(new OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. delete(info);
  35. }
  36. });
  37. holder.tv_number.setText(info.getNumber());
  38. if ("1".equals(info.getMode())) {
  39. holder.tv_mode.setText("电话拦截");
  40. } else if ("2".equals(info.getMode())) {
  41. holder.tv_mode.setText("短信拦截");
  42. } else {
  43. holder.tv_mode.setText("全部拦截");
  44. }
  45. return view;
  46. }
  47. @Override
  48. public Object getItem(int position) {
  49. return null;
  50. }
  51. @Override
  52. public long getItemId(int position) {
  53. // TODO Auto-generated method stub
  54. return 0;
  55. }
  56. }
  57. static class ViewHolder {
  58. TextView tv_number;
  59. TextView tv_mode;
  60. ImageView iv_delete;
  61. }

来自为知笔记(Wiz)

时间: 2024-10-16 10:49:52

ListView优化的相关文章

10熟练掌握listview优化

熟练掌握listview优化,获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式 ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个item,要求 adapter "返回一个视图" (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这

Adaptert Listview 优化

这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多.所以学习了关于listview的优化,并且这也是普遍使用的方法.我们一般来说创建listview的话更常用的是继承BaseAdapter的方式进行实现,因为这样可以自定义list没一个item的布局,根据程序的需求进行定制,一般来说listview所展示的数据都是比较多的,一般也有比较少的.所以,不对adapter进行优化的话,那么每一次拖动listv

ListView优化-ViewHolder缓存

安卓开发中ListView控件是一个使用频率相当的高级控件,通常用于展示一系列相似度极高的数据,当数据量极大或布局相当复杂时,ListView的性能优化就显得非常重要.所以在开发中不但功能上要满足,而且在性能上也不能马虎.        使用ListView是一个标准的适配器设计模式,ListView把数据.XML布局和Adapter有极地结合在一起完成一系列的展示功能.在ListView的数据展示中,每次滑动ListView都会触发getView()方法的调用,并且XML定义的布局是在也是在适

Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到. 他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样的方式是静态注冊 以下是配置样例 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" andro

Android MaoZhuaWeiBo Adapter ListView优化及发送微博 - 4

这一篇主要给大家说说Adapter ListView优化及发送微博,我们都知道Android在一些比较耗内存的类里,为了尽量避免浪费内 存,我们需要对我们的组件之类的进行优化,使其节约不必要的资源浪费 自定义适配器: package com.neweriweibo.adapter; /** * 适配器 * @author Engineer-Jsp * @date 2014.10.28 * */ import java.util.ArrayList; import com.neweriweibo.

listView优化以及内存泄露问题

最经开发app使出现了由于ListView产生的内存泄露问题.我们知道内存泄露时很不好的.意味着,代码写的有点失败,需要做些优化改动. 经过这次的教训,以及在网上找了些资料,总结了一下,关于ListView的优化: listview优化问题: 首先,listview必须严格按照convertView及viewHolder格式书写,这样可以基本保证数据最优. 其次,如果自定义Item中有涉及到图片等等的,一定要做图片优化.bitmap释放可以不做. 第三,尽量避免在BaseAdapter中使用st

listview优化2

ListView优化2: 如果一个listView不做任何的优化,而且有很多的条目,当我们快速的拖动listView的界面的时候,就不断的GCGC(Garbage Collection )垃圾回收,当GC到某个时候就会(OOM)outofmemory内存溢出,应用程序也就会随之挂掉,产生这个问题的原因是什么呢?我们知道listView的特点是每产生一个条目就会调用一次getView方法,如果我们不进行优化,每一次调用都要执行getView方法中的所有语句,而且会在最上面的条目移出界面的时候回收掉

内存泄露--contentView缓存使用与ListView优化

引起Android内存泄露有很多种原因,下面罗列了一些问题,以后会一一解决 1.构造Adapter时没有使用缓存convertView(衍生出ListView优化问题) 2.查询数据库游标没有关闭 3.Activity中生命周期对象大于Activity生命周期(关于Application Context与Activity Context) 4.Bitmap对象不使用时没有recycle掉(这里还有其他解决方案) 今天说的是第一种:如何使用缓存来优化ListView 因为如果不使用缓存conver

ListView优化的代码

第三种ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度. 当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件).再用conver

Android 常驻与非常驻型广播的区别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManifast.xml进行注册.通常说这种方式是静态注册 下面是配置例子 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" android