Android ListView性能优化
来源:互联网 发布:北京赛车源码 编辑:程序博客网 时间:2024/05/24 07:22
Google Staff有一篇Turbo-charge your UI关于加速和提高Android UI效率的文章。
把其中关于ListView的部分整理了一下,如下。
1.Globle view
ListView上面关联上需要现实的布局,控件等等。
Adapter建立数据和ListView上面表示控件的关系
DataSource就是存储的数据源,要在ListView表示的数据源
和iPhone中的View, ViewController,等基本上结构还是类似的
2.ListView 和Adpater建立关联和要注意的地方
* 对每一行的数据,对会调用 -- Adapter.getView()来返回要现实的数据。
* 返回一个New的View,系统开销还是比较大的,原文介绍是说Expensive
* 数据量少,还好办,开销也不会太多,如果100万以上呢? 呵呵,这个数据
在Mobile上处理还是有点bt.... 目前测试到的数据10万左右很流程。
3.ListView每行表示的效率问题
不要这么干(Don't): 每次产生ListView的ListItem都会开销一个New View
public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return item;
}
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return item;
}
可以这么干(Do): 判断试图时候为空,如果已经产生过了,就利用现在的。
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
最好这么做(Even better): 个人理解是做了一个Class,把需要展示的控件列入,加快了Memory clone的效率
static class ViewHolder {
TextView text;
ImageView icon;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
TextView text;
ImageView icon;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
4.效率如何呢:
比较效果看后,利用ViewHolder后,速度大概有3倍以上的提升
- android ListView 性能优化
- Android ListView性能优化
- android listview 性能优化
- Android ListView性能优化
- Android Listview 性能优化
- android:listview性能优化
- android ListView性能优化提示
- Android之ListView性能优化
- android listview gridview 性能优化
- Android之ListView性能优化
- android ListView适配器性能优化
- Android之ListView性能优化
- Android之ListView性能优化
- Android listview的性能优化
- android性能优化学习笔记-listview优化
- Android性能优化--listview 优化机制
- Android性能优化--listview 优化机制
- [Android]ListView性能优化之视图缓存
- float类型能精确表达整型数100亿和1000亿吗?
- [HTML5-SVG]使用svg代替css3实现渐变
- 打包软件里面安装完打开网页
- 免费的响应式bootstrap管理员后台界面主题 - Charisma
- Java自学视频整理(持续更新中...)
- Android ListView性能优化
- 详解CASSANDRA0.7配置文件
- java编程之起步HelloWorld
- Android 开发之旅:深入分析布局文件&又是“Hello World!”
- PCI的时分复用数据地址总线
- Device 'kvm-pci-assign' could not be initialized
- TechExcel全球敏捷研发管理训练营,2013上海首站
- Ubuntu下SSH设置
- 给定一个字符串,求出其最长的重复子串。