安卓开发中ListView控件是一个使用频率相当的高级控件,通常用于展示一系列相似度极高的数据,当数据量极大或布局相当复杂时,ListView的性能优化就显得非常重要。所以在开发中不但功能上要满足,而且在性能上也不能马虎。
        使用ListView是一个标准的适配器设计模式,ListView把数据、XML布局和Adapter有极地结合在一起完成一系列的展示功能。在ListView的数据展示中,每次滑动ListView都会触发getView()方法的调用,并且XML定义的布局是在也是在适配器的getView()方法中使用布局加载器LayoutInflater加载,LayoutInflater加载布局是件相当耗资源的事儿,又加之findViewById()方法是一个耗时的操作,由此看出频繁的inflater()和findViewById()操作会给应用带来相当严重的性能问题,所以ListView的性能优化是刻不容缓的,好在Google工程师已经为我们提供了相应的解决方案,ListView的缓存功能。
       看例子之前先看看效果图:

下面就通过一个简单的Demo来诠释上面的描述。

package com.hitech.convertholderdemo;

import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { public static final String TAG = "MainActivity"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.lv_activity_main);
listView.setAdapter(new ListViewDataAdapter());
} private class ListViewDataAdapter extends BaseAdapter { private List<String> list = new ArrayList<String>(); public ListViewDataAdapter() {
for (int i = 0; i < 100; i++) {
list.add(i + "");
}
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder holder = null;
if (convertView != null) {
// 如果convertView中有缓存
view = convertView;
// 直接使用缓存并从中取出缓存的ViewHolder对象
holder = (ViewHolder) view.getTag();
Log.e(TAG, "使用缓存的convertView" + position);
} else {
Log.e(TAG, "没有缓存的convertView" + position);
// 如果没有缓存,就从XML文件加载布局
view = getLayoutInflater().inflate(
R.layout.dialog_popup_main_activity, null);
// 将加载布局中的控件缓存到ViewHolder中
holder = new ViewHolder();
holder.textview_username = (TextView) view
.findViewById(R.id.textview_username);
holder.textview_nickname = (TextView) view
.findViewById(R.id.textview_nickname);
holder.checkbox_selected = (CheckBox) view
.findViewById(R.id.checkbox_selected);
// 把holder对象做为数据存到view
view.setTag(holder);
}
// 对布局中的控件进行设置 由于
holder.textview_nickname.setText(list.get(position));
holder.textview_username.setText(list.get(position));
holder.checkbox_selected.setText(list.get(position));
return view;
}
} public static class ViewHolder {
// 对布局文件中的控件按面向对象思想封装
TextView textview_username = null;
TextView textview_nickname = null;
CheckBox checkbox_selected = null;
}
}

ListView优化-ViewHolder缓存的更多相关文章

  1. ListView优化-ViewHolder的优化备份

    ViewHolder.java package cn.edu.bzu.util; import android.content.Context; import android.util.SparseA ...

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

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

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

    引起Android内存泄露有很多种原因,下面罗列了一些问题,以后会一一解决 1.构造Adapter时没有使用缓存convertView(衍生出ListView优化问题) 2.查询数据库游标没有关闭 3 ...

  4. Android性能优化--Listview优化

    ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个it ...

  5. listview 优化

    ListView的优化: (前两点都是利用ListView的自身优化机制优化[缓存优化]) 1.利用ListView自身的缓存机制,他会缓存条目中的一个条目item,当listview第一屏显示完成之 ...

  6. listview优化 汇总

    1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...

  7. Android——ListView优化

    1.ListView基本概念 列表显示需要三个元素: ListView:用来展示列表的View. 适配器:用来把数据映射到ListView上 数据:具体的将被映射的字符串,图片或基本组件 适配器类型分 ...

  8. Android零基础入门第43节:ListView优化和列表首尾使用

    原文:Android零基础入门第43节:ListView优化和列表首尾使用 前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪 ...

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

    1.常驻型广播  常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到.  他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样 ...

随机推荐

  1. hibernate之4.延迟载入

    延迟载入: 仅仅有当使用以实体对象的属性(除主键属性外)时,才会发送查询语句到数据库 get不支持延迟载入 @Test public void getTest(){ Session session=n ...

  2. java-面向对象(二)

    这几天正在看HeadFirst的时候,突然认为面向对象的几个特点,有点理解模糊不清.所以在这再次回想一下,加深印象. 上篇博客(http://blog.csdn.net/u010539352/arti ...

  3. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)-转载

    相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗?  这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来说比 ...

  4. POJ 3273 Monthly Expense 【二分答案】

    题意:给出n天的花费,需要将这n天的花费分成m组,使得每份的和尽量小,求出这个最小的和 看题目看了好久不懂题意,最后还是看了题解 二分答案,上界为这n天花费的总和,下界为这n天里面花费最多的那一天 如 ...

  5. FCC高级编程篇之Symmetric Difference

    Symmetric Difference Create a function that takes two or more arrays and returns an array of the sym ...

  6. oralce模糊查询之含有通配符

    oracle中通配符有 '_'和'%'当like  '_ww%'时,会把'_'和'%'当作通配符使用导致查不出含有'_'和'%'的数据.这时用到转译字符 like '\_ww\%' escape '\ ...

  7. K-D树学习笔记

    这东西其实就是高维二叉树?(反正我只会二维的) 大概就是把一个高维矩形按每一维分,一个点(及其子树)就表示一个高维区间,乱搞一下,就……没了? //BZOJ4066 "简单"题 / ...

  8. omi-mp-create源码加注

    omi-mp-create是dntzhang写的小程序框架,主要功能是实现全局状态自动更新和页面间通信,传送门. 代码虽然简单但是注释不多读起来还是需要一点时间理解,因此在上面加入了个人理解的注释方便 ...

  9. mac终端安装webpack的时候报错Err,解决的办法 sudo npm install webpack -g

    MacBook-Air:~ xxx$ npm install webpack -g npm WARN invalid config registry="" npm WARN inv ...

  10. POJ 3261 Milk Patterns(后缀数组+单调队列)

    题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ...