Android——ViewHolder的作用与用法
2024-10-19 14:17:45
转载至:https://www.cnblogs.com/wugu-ren/p/6106379.html
ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。
ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}
方法中进行的(要自定义listview都需要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。
getview的加载方法一般有以下三种种方式:
最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据
1 public View getView(int position, View convertView, ViewGroup parent)
2 {
3 View item = mInflater.inflate(R.layout.list_item_icon_text,
4 null);
5 ((TextView)
6 item.findViewById(R.id.text)).setText(DATA[position]);
7 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
8 (position & 1) == 1 ? mIcon1 : mIcon2);
9 return item;
10 }
正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据
1 public View getView(int position, View convertView, ViewGroup parent)
2 {
3 if (convertView == null) {
4 convertView = mInflater.inflate(R.layout.item, parent, false);
5 }
6 ((TextView)
7 convertView.findViewById(R.id.text)).setText(DATA[position]);
8 ((ImageView)
9 convertView.findViewById(R.id.icon)).setImageBitmap(
10 (position & 1) == 1 ? mIcon1 : mIcon2);
11 return convertView;
12 }
最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
1 static class ViewHolder {
2 TextView text;
3 ImageView icon;
4 }
5 public View getView(int position, View convertView, ViewGroup parent)
6 {
7 ViewHolder holder;
8 if (convertView == null) {
9 convertView = mInflater.inflate(R.layout.list_item_icon_text,
10 parent, false);
11 holder = new ViewHolder();
12 holder.text = (TextView) convertView.findViewById(R.id.text);
13 holder.icon = (ImageView) convertView.findViewById(R.id.icon);
14 convertView.setTag(holder);
15 } else {
16 holder = (ViewHolder) convertView.getTag();
17 }
18 holder.text.setText(DATA[position]);
19 holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 :
20 mIcon2);
21 return convertView;
22 }
最新文章
- Centos 7 使用jenkins 打包android项目
- 获取终端ip地址
- 2014鸟人Birdman中文字幕文件下载
- ASP.NET三层架构之不确定查询参数个数的查询
- 通过JDBC进行简单的增删改查(二)
- Android网络编程系列 一 Socket抽象层
- Unity3D ShaderLab 车辆喷漆光照模型实战
- Java学习笔记——JDK1.7的新特性。
- LNMP下防跨站、跨目录安全设置,仅支持PHP 5.3.3以上版本
- Webform——验证控件
- 吃了单片机GPIO端口工作模式的大亏 ——关于强推挽输出和准双向口(弱上拉)的实际应用
- 论山寨手机与Android联姻 【3】手机是怎样生产出来的
- Codeblocks快捷键
- java泛型类的继承规则
- MR-join连接1......
- 移动端弹出层加遮罩后禁止body滑动
- JMeter中BeanShell断言使用一
- mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引
- Installing Hyperledger Fabric v1.1 on Ubuntu 16.04 — Part II &;  Part III
- HDUOJ---1233还是畅通工程