ListView优化方案的几点解析

1、为什么做优化

        说起为什么要对ListView这个控件做优化,这个问题还真不是那么容易回答,因为它要优化的原因实在是太简单,那就是Android手机性能有限,要让它跑起来很流畅,自然就有了优化的需求了。优化过后的应用程序,会跑得比较流畅,能够让用户体验显著提升。

        这里我们主要讨论它需要节约时间,让程序更加流畅。那么问题来了,如何节约时间了,这就是一个空间换时间的问题了。


2、ListView工作原理

        如果要谈优化,首先应该对ListView这个控件怎么运行的了解清楚吧,这个东西不了解,我们谈优化犹如水中捞月一样,是个笑话。

        ListView其实是一个滑动控件,只是使用的是list集合存储数据,显示的方式是一个条目占满一行这样的形式来的。与之类似的GrivdView也是类似的工作原理,一通则百通,类似的道理。ListView是一堆具有相同属性的数据,展示在界面上。什么是有规律的呢?比如,食堂的一排桌子椅子,他们就是又规律的放在一起的,只是每个桌子上坐着的人可能不一样。如果我们把人看作数据,那么桌子和椅子就可以看作是我们界面上的控件。

        基于上面的认识,我们会不会想到,如果是这样的话,我们只要获取到不同的数据,然后将控件复制多个就可以了,对不对?嗯,就是这样的,我们看一下下面的图示:


       上面这幅图,是我从网上找来的,比我画得好,我就不重复造轮子了。这里有两个意思,第一个是重复创建很多个item控件,第二个是,利用相同的item控件。第一个我们上面已经解说了,这里不再赘述,我们谈谈第二个。这里我们发现一个问题,那就是我们的手机屏幕大小是有限的,但是item的数据内容可能就会有很多,不只是几条数据,几十条数据,可能成百上千条数据。那么,android系统中如何做优化的呢?

        原始的方式,我们只显示这么多控件信息,控件保持不变,变化的是数据,使用相同的控件信息,但是使用不同的数据内容。哇靠,清晰了吧!


3、简单优化方式

       最简单的方式是使用conentView进行缓存处理,这里代码如下:

		if (convertView == null) {
			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.item_more_view, null);
			holder.tv_item_title = (TextView) convertView
					.findViewById(R.id.tv_item_more_title);
			holder.iv_item_home = (ImageView) convertView
					.findViewById(R.id.iv_item_more_view);
			holder.tv_item_issue = (TextView) convertView
					.findViewById(R.id.tv_item_more_issue);
			holder.progressBar = (ProgressBar) convertView
					.findViewById(R.id.bar_item_more);
			holder.tv_item_person = (TextView) convertView
					.findViewById(R.id.tv_person_item_more);
			holder.btn_item_home = (Button) convertView
					.findViewById(R.id.btn_item_more);

		} 


4、深度优化方式

       经过简单的测试,上面的代码,大概能优化50%左右,但是我们发现,这种优化方式还不够,视图的回收并不是我们所期望的最好方式,这里我们可以把它再次缓存起来。说到底,还是一个空间换时间的思路:

ViewHolder holder = null;
		if (convertView == null) {
			holder = new ViewHolder();

			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.item_more_view, null);
			holder.tv_item_title = (TextView) convertView
					.findViewById(R.id.tv_item_more_title);
			holder.iv_item_home = (ImageView) convertView
					.findViewById(R.id.iv_item_more_view);
			holder.tv_item_issue = (TextView) convertView
					.findViewById(R.id.tv_item_more_issue);
			holder.progressBar = (ProgressBar) convertView
					.findViewById(R.id.bar_item_more);
			holder.tv_item_person = (TextView) convertView
					.findViewById(R.id.tv_person_item_more);
			holder.btn_item_home = (Button) convertView
					.findViewById(R.id.btn_item_more);

			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

这里的ViewHolder如下所示:

/** 界面控件 */
	public final class ViewHolder {
		public TextView tv_item_title; // 标题栏
		public ImageView iv_item_home; // 商品图片
		public TextView tv_item_issue;// 显示第几期
		public ProgressBar progressBar;// 进度条
		public TextView tv_item_person;// 显示还有多少人
		public Button btn_item_home;// 抢单按钮
	}


5、优化总结

(1)、减少findViewById()的次数,findViewById是一个相对比较耗性能的操作,它每次都需要到布局文件中去查找空间信息,然后加载bean对象中的数据内容,显示在界面上。

(2)、优化,其实也就是两种,一种是时间换空间,一种空间换时间。依照现在对用户体验的重视,硬件资源的价格下降,大多数情况都是使用空间换时间,要让用户体验更好。

(3)、缓存,优化要尤其注意缓存这个东西,它的优化是最快的。重新在内存中生成的时间远大于直接从内存中获取,最常见的就是数据库的链接,不要经常断开去查询,这样做是非常耗时的操作。

(4)、经验,在做优化的时候,经验也是很重要的,不过这一点在移动端并不是那么明显。在做服务器端开发的时候,这种经验就非常重要,你对一个业务的熟悉,有助于你写出更好的程序。优化并不仅仅是从程序代码中优化,也可以从业务流程上去优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值