要想优化ListView首先要了解它的工作原理,列表的显示须要三个元素:ListView、Adapter、显示的数据。

这里的Adapter就是用到了适配器模式,无论传入的是什么View在ListView中都能显示出来。

以下简单说下上图的原理:

1、假设你有几千几万甚至很多其它的选项(item)时。当中仅仅有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其它的在Recycler中

2、ListView先请求一个type1视图(getView)然后请求其它可见的项目。convertView在getView中是空(null)的。第一次都是为空的。仅仅要显示过了convertView都不为空,会保存在Recycler中

3、当item1滚出屏幕。而且一个新的项目从屏幕低端上来时。ListView再请求一个type1视图。

convertView此时不是空值了,它的值是item1。你仅仅需设定新的数据然后返回convertView,不必又一次创建一个视图,省去了inflate和findViewById的时间,性能就得到了优化。

了解了它的工作原理后,我们就能够反复利用convertView,仅仅要不为空就直接使用。改变它的内容即可了。

使用ListView的时候都会搭配一个Adapter,为了使得性能更优。ListView会缓存行item(某行相应的View)。ListView通过Adapter的getView函数获得每行的item。

package com.dzt.listviewdemo;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { private ListAdapter adapter;
private ListView lv = null;
private ArrayList<String> list = new ArrayList<String>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv_list);
adapter = new ListAdapter();
for (int i = 0; i < 100; i++) {
list.add("item " + i);
}
lv.setAdapter(adapter);
} private class ListAdapter extends BaseAdapter { private LayoutInflater mInflater; ListAdapter() {
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} @Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
System.out.println("getView " + position + " " + convertView);
viewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
holder = new viewHolder();
holder.text = (TextView) convertView.findViewById(R.id.tv_text);
holder.image = (ImageView) convertView
.findViewById(R.id.iv_img);
convertView.setTag(holder);
} else {
holder = (viewHolder) convertView.getTag();
}
holder.text.setText(list.get(position));
if (position % 2 == 0) {
holder.image.setImageResource(R.drawable.ic_launcher);
} else {
holder.image.setImageResource(R.drawable.icon);
} return convertView;
} } /**
* 使用一个类来保存Item中的元素
*
* @author Administrator
*
*/
public static class viewHolder {
public TextView text;
public ImageView image;
}
}

执行效果



第一次打印的结果convertView都是为null

滑动ListView后的打印

从上面的打印消息能够看出,Recycler中会保存七个convertView对象用来显示Item。无论你有上千个Item,也仅仅会创建显示满屏的convertView。这就大大节省了内存,对viewHolder的Tag的使用也大大节省了性能开销

相关代码下载:http://download.csdn.net/detail/deng0zhaotai/7842885

Android性能优化之ListView缓存机制的更多相关文章

  1. Android性能优化之Listview(ViewHolder重用机制)

    相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了. ListView优化主 ...

  2. android 性能优化

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...

  3. Android性能优化典范第一季

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  4. Android性能优化的浅谈

    一.概要: 本文主要以Android的渲染机制.UI优化.多线程的处理.缓存处理.电量优化以及代码规范等几方面来简述Android的性能优化 二.渲染机制的优化: 大多数用户感知到的卡顿等性能问题的最 ...

  5. [转]Android性能优化典范

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  6. [Android Pro] Android性能优化典范第一季

    reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性 ...

  7. Android优化—— Google 发布 Android 性能优化典范

    阅读目录 0)Render Performance 1)Understanding Overdraw 2)Understanding VSYNC 3)Tool:Profile GPU Renderin ...

  8. Android性能优化典范(转)

    转载自oschina. 2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍 ...

  9. Android性能优化典范(二)

    Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...

随机推荐

  1. Chisel Tutorial(一)——Chisel介绍

    Chisel是由伯克利大学公布的一种开源硬件构建语言,建立在Scala语言之上,是Scala特定领域语言的一个应用,具有高度參数化的生成器(highly parameterized generator ...

  2. jquery源码ajax分析

    http://www.cnblogs.com/aaronjs/p/3683925.html

  3. 0xC0000005;Access Violation(栈区空间很宝贵, linux上栈区空间默认为8M,vc6下默认栈空间大小为1M)

    写C/C++程序最怕出现这样的提示了,还好是在调试环境下显示出来的,在非调试状态就直接崩溃退出. 从上述汇编代码发现在取内存地址 eax+38h 的值时出错, 那说明这个地址非法呗, 不能访问, 一般 ...

  4. poj--1236--Network of Schools(scc+缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14062   Accepted: 56 ...

  5. C#对 Json的序列化和反序列化时出现“k_BackingField”

    在C#2.0的项目中,以前经常使用Json.NET实现序列化和反序列化.后来从c#3.0中开始使用新增的DataContractJsonSerializer进行json相关的操作.微软提供的原生类库使 ...

  6. [转自百度贴吧-本人亲测有效]Adobe XD 打开立即闪退问题修复

    出现闪退的原因还是因为缺少C++组件, 下载 DirectXRepairV3.7软件 原文: https://tieba.baidu.com/p/5961511474 软件下载: http://xia ...

  7. word-break属性和css换行显示

    这几天在做项目的时候,遇到了比较棘手的问题,便是在一个标签里边展示内容,如果说展示中文汉字,一点问题都没有,但是只要连续展示英文字母或者中文的标点符号(中间不带空格),那么所渲染的内容就不会换行,而是 ...

  8. PHP单词表

    输出语句printechovar_dumpprint_rprintf变量的操作unset预定义变量$_SERVER$_GET$_POST$_REQUEST$_COOKIE,$_SESSION 会话技术 ...

  9. 备份和恢复ZBrush文件

    ZBrush可以自动保存绘图的备份副本,并在发生系统错误时提醒您恢复备份副本.当ZBrush软件遇到崩溃.导致错误.非正常退出的时候,可能之前所做的努力就会功亏一篑,那么,在ZBrush软件中能否将文 ...

  10. ZBrush中Magnify膨胀笔刷介绍

    Magnify膨胀笔刷是ZBrush®笔刷中经常使用的,利用该笔刷可绘制中心向四周膨胀的效果.本文内容向大家介绍ZBrush®中膨胀笔刷以便大家熟悉它的用法和特性. Magnify膨胀笔刷 Magni ...