Android性能优化之ListView缓存机制
来源:互联网 发布:c语言指针指向字符串 编辑:程序博客网 时间:2024/05/09 19:08
要想优化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>();@Overrideprotected 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);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubSystem.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缓存机制
- Android性能优化之ListView缓存机制
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- Android ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存
- [Android]ListView性能优化之视图缓存(android.widget.ListView)
- [Android 界面]ListView性能优化之视图缓存
- 用sar和pg收集和监控和管理大规模服务器
- hdu 2870 Largest Submatrix (DP)
- android中用Spannable在TextView中设置超链接、颜色、字体
- HTTP开源库
- Object-c基础编程学习笔记-对象初始化
- Android性能优化之ListView缓存机制
- 将plist中的单图提取出来
- java学习_08_图形用户界面GUI
- 二叉树题目总结
- STM32L152 ADC使用总结
- struts配置
- 各互联网公司offer比较
- 类作用域
- Locality Sensitive Hashing ( LSH,局部敏感哈希 ) 详解