Android性能优化之ListView缓存机制
要想优化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的使用也大大节省了性能开销
相关文章
- android:Cordova Android, hello Cordova ,PhoneGap android
- Android应用性能优化最佳实践.
- Android应用性能优化最佳实践.2.5 启动优化
- Android应用性能优化最佳实践.2.6 合理的刷新机制
- Android应用性能优化最佳实践.2.7 提升动画性能
- Android线上轻量级APM性能监测方案
- android的listview组件
- Android ANR全解析&华为AGC性能管理解决ANR案例集
- Android常用开源项目
- 《Java和Android开发学习指南(第2版)》——第1章,第1.5节本章小结
- Android:30分钟弄明白Touch事件分发机制
- android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动
- android蓝牙主动发起配对实例
- 性能优化之Java(Android)代码优化
- Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序
- Android 性能优化—— 启动优化提升60%
- 解决Android SDK Manager下载问题和android studio每次启动都要在fetching Android sdk compoment information
- Android Studio升级或更新项目,经常造访的“Could not find com.android.tools.build :gradle: x.x.x”的原因分析
- 【转载】 Android ListView性能优化之视图缓存
- 【AGC】如何指定应用发布到特定的Android系统版本
- Android性能优化9-ANR完全解析
- Android回调事件传播-android学习之旅(四十五)
- 完全卸载Android Studio(卸载得干干净净)