要想优化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. SwipeRefreshLayout与ViewPager滑动事件冲突解决

    问题描写叙述: 开发中发现,SwipeRefreshLayout的下拉刷新,与ViewPager开发的banner的左右滑动事件有一点冲突,导致banner的左右滑动不够顺畅. 非常easy在bann ...

  2. 基于servlet实现一个web框架

    servlet作为一个web规范.其本身就算做一个web开发框架,可是其web action (响应某个URI的实现)的实现都是基于类的,不是非常方便,而且3.0之前的版本号还必须通过web.xml配 ...

  3. MFC exe使用C++ dll中的std::string 崩溃

    VC6中 MFC exe中 new  纯C++ dll dll 崩溃 我把纯C++的 dll,用/MTd 换成/MDd.就能够了

  4. When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向

    链接:http://ucys.ugr.es/jnic2016/docs/MachineLearning_LiorRokachJNIC2016.pdf https://people.eecs.berke ...

  5. 机器学习 数据量不足问题----1 做好特征工程 2 不要用太多的特征 3 做好交叉验证 使用线性svm

    来自:https://www.zhihu.com/question/35649122 其实这里所说的数据量不足,可以换一种方式去理解:在维度高的情况下,数据相对少.举一个特例,比如只有一维,和1万个数 ...

  6. hdoj--1276--士兵队列训练问题(数组模拟)

    士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. Java-MyBatis:MyBatis XML 文件

    ylbtech-Java-MyBatis:MyBatis XML 文件 1.返回顶部 1. Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大, ...

  8. Weex学习与实践(一):Weex,你需要知道的事

    Weex学习与实践(一):Weex,你需要知道的事 http://coderyi.com/posts/weex1/ 1.命令行工具:weex-toolkit  https://github.com/w ...

  9. 阿里云服务器用Docker配置运行nginx并访问

    一.Docker拉取nginx镜像 docker pull nginx:1.12.2 这里是下载的是nginx的1.12.2版本,其他版本的镜像请访问https://hub.docker.com/r/ ...

  10. jQuery插件开发的两种方法

    1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $. ...