ListView优化大致从以下几个角度:
1.复用已经生成的convertView;
2.添加viewHolder类;
3.缓存数据(图片缓存);
4.分页加载。

一、复用convertView
首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。

这连个超链接需要看看 ,写的比较好
http://www.cnblogs.com/itstudent/p/3729117.html
http://blog.csdn.net/jacman/article/details/7087995

这是我做的程序测试:

看代码:

package com.example.mypic;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;public class MainActivity extends Activity {private ListView listView;private MyAdapter adapter;private int[] items = new int[] { R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc, R.drawable.pc, R.drawable.pc,R.drawable.pc, R.drawable.pc };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);listView = (ListView) findViewById(R.id.listView);Log.v("aa", "--显示图片-1-");adapter = new MyAdapter(this, items);Log.v("aa", "--显示图片-2-");listView.setAdapter(adapter);Log.v("aa", "--显示图片-3-");adapter.notifyDataSetChanged();}
}
package com.example.mypic;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;public class MyAdapter extends BaseAdapter {private int[] items = new int[] {};private Context context;private String TAG = "aa";private Bitmap bitmap = null;public MyAdapter(Context context, int[] items) {this.context = context;this.items = items;}@Overridepublic int getCount() {return items.length;}@Overridepublic Object getItem(int position) {return items[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//Log.v(TAG, "position=="+position);//Log.v(TAG, "convertView=="+convertView);//Log.v(TAG, "ViewGroup=="+parent);ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);holder = new ViewHolder();holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);holder.textView = (TextView) convertView.findViewById(R.id.textView);Log.v(TAG, position+"----"+holder);convertView.setTag(holder);}else {holder = (ViewHolder) convertView.getTag();Log.v(TAG, position+"--1--"+holder);}bitmap = BitmapCompressTools.decodeSampledBitmapFromResource(context.getResources(), R.drawable.pc, 100, 100);//Log.d(TAG, "压缩之后的图片大小为:" + bitmap.getByteCount());holder.imageView.setImageBitmap(bitmap);holder.textView.setText("图片"+position);return convertView;}class ViewHolder {ImageView imageView;TextView textView;}
}
package com.example.mypic;import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;public class BitmapCompressTools {public static Bitmap decodeSampledBitmapFromResource(Resources res,int resId, int reqWidth, int reqHeight) {// 给定的BitmapFactory设置解码的参数final BitmapFactory.Options options = new BitmapFactory.Options();// 从解码器中获取原始图片的宽高,这样避免了直接申请内存空间options.inJustDecodeBounds = true;BitmapFactory.decodeResource(res, resId, options);// Calculate inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, reqWidth,reqHeight);// 压缩完后便可以将inJustDecodeBounds设置为false了。options.inJustDecodeBounds = false;return BitmapFactory.decodeResource(res, resId, options);}/*** 指定图片的缩放比例* * @param options* @param reqWidth* @param reqHeight* @return*/public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {// 原始图片的宽、高final int height = options.outHeight;final int width = options.outWidth;int inSampleSize = 1;//        if (height > reqHeight || width > reqWidth) {
//          //这里有两种压缩方式,可供选择。
//          /**
//           * 压缩方式二
//           */
//          // final int halfHeight = height / 2;
//          // final int halfWidth = width / 2;
//          // while ((halfHeight / inSampleSize) > reqHeight
//          // && (halfWidth / inSampleSize) > reqWidth) {
//          // inSampleSize *= 2;
//          // }
//          /*** 压缩方式一*/// 计算压缩的比例:分为宽高比例final int heightRatio = Math.round((float) height/ (float) reqHeight);final int widthRatio = Math.round((float) width / (float) reqWidth);inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
//      }return inSampleSize;}
}

main.ml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true" ></ListView></RelativeLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" ><ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_marginLeft="20dp"/></LinearLayout>

这是运行结果图:

ListView的性能优化之convertView和viewHolder相关推荐

  1. android listview gridview 性能优化

    有关图片加载的一些记录.这里针对的主要是会有大量的AdapterView需要快速滚动加载图片情况 一些如 异步加载,文件缓存,LruCache内存缓存Bitmap等的常规的通用方式就不在这里说,这些可 ...

  2. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  3. Android之开发性能优化简介

    原帖地址:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=327340&extra=page%3D1%26filter%3 ...

  4. 【Tech-Android-Other】Android性能优化

    随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以需要开发人员更 ...

  5. Android开发性能优化大总结

    有时间了,我会不段更新! 一.Android相关 1. 采用硬件加速,在androidmanifest.xml中application添加android:hardwareAccelerated=&qu ...

  6. Android性能优化之提高ListView性能的技巧

    ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的ge ...

  7. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

  8. ListView中convertView和ViewHolder的工作原理

    w和Adapter 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 工作原理:  1.ListView针对Lis ...

  9. Android Listview 性能优化

    首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewH ...

最新文章

  1. 苹果Q1财报出炉:手机收入下滑15%,服务收入增长19%
  2. 大数据处理的关键架构
  3. php推荐码生成,最新最全PHP生成制作验证码代码详解(推荐),验证码详解_PHP教程...
  4. BZOJ 1432 [ZJOI2009]Function
  5. 2019可信云云计算开源产业大会:腾讯云TStack获多云管理认证及多项殊荣
  6. 索尼android 怎么截屏快捷键,索尼XZ Premium怎么截屏 2种索尼XZ Premium截图方法
  7. ImportError: No module named 'ConfigParser'和ImportError: No module named 'cPickle'
  8. Spring Boot 发送邮件
  9. C++网络编程实例之多个客户端交互(多线程)
  10. 在苹果Mac中开启通用控制的方法
  11. Vue将汉字转为拼音,取出首字母
  12. 计算机的地址是指什么意思,什么是PC地址,什么是PLC地址
  13. kangle安装php7.0_Kangle Easypanel面板 PHP多版本切换 安装图文教程
  14. MVP、EMC、CRM、IoT、边缘计算盒子、系统群控、数字化赋能、EMS、冷媒
  15. Day 73 Npm包管理 +Express+路由+中间件
  16. 使用opencv调用摄像头识别颜色(python版)
  17. 面试经历|为即将找工作的你保驾护航
  18. n个数输出最大值和最小值
  19. 工信部网站备案的备案流程
  20. stm32定时器与定时器中断

热门文章

  1. AI未成解药 流利说2019年净亏5.75亿 Q4付费用户再降20万
  2. 中国移动老功臣退休致辞:工作结束了 人生没结束
  3. 又一个时代结束了!Adobe宣布在2020年彻底停止Flash更新
  4. 中国移动中国联通中国电信 三家运营商公布首批5G城市名单
  5. 又出问题 三星Galaxy S10被曝意外触摸保护功能无效
  6. 每天都用微信聊天,但你可能不知道它还隐藏着这些超实用的功能
  7. 《运营之光》-- 学习笔记(四)
  8. Python 中的黑暗角落(一):理解 yield 关键字
  9. mysql master slave 灾备技术_MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】...
  10. 字符串:2.BF算法(普通模式匹配算法)