安卓开发中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;
}
}

最新文章

  1. CSS3文字渐变效果
  2. 简单的学习心得:网易云课堂Android开发第三章自定义控件
  3. Centos下yum安装PHP
  4. win8.1解决鼠标右键反应慢的问题
  5. 小记:事务(进程 ID 56)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。
  6. Ant -- Another Neat Tool
  7. javascript 回车提交指定按钮
  8. unity 协同
  9. HTML &lt;base&gt; 标签
  10. android studio引入第三方包记录
  11. (转)RPC原理详解
  12. C语言-02基本运算
  13. SystemTap----常用变量、宏、函数和技巧
  14. Gradle的简介与安装
  15. ASP.NET MVC的跳转攻击问题
  16. git(2)----Git的常用撤销技巧与解决冲突方法
  17. react 16 ssr的重构踩坑
  18. 【Java并发编程一】线程安全问题
  19. Android学习笔记--通过wifi向服务器端发送数据
  20. php时间轴函数,很不错,记下了

热门文章

  1. codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱
  2. ubuntu 交叉编译qt 5.7 程序到 arm 开发板
  3. centos6.0 配置SVN
  4. linux下挂载ISCSI存储设备
  5. vue 父子组件传值以及方法调用,平行组件之间传值以及方法调用大全
  6. hiho1560 - 矩阵快速幂
  7. poj1170 - 转换成背包
  8. 关于VS2013 Browser Link 新功能
  9. anaconda安装basemap
  10. 【jQuery03】简单的选项卡切换