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
    评论
ListView是Android中常用的控件,它可以展示一列数据,并且支持滑动、点击等交互操作。使用ListView需要自定义Adapter来管理数据和界面的显示。 以下是一个简单的ListView使用示例: 1. 定义ListView布局文件,例如listview_layout.xml: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 定义ListView的每一个item布局文件,例如list_item_layout.xml: ``` <TextView android:id="@+id/item_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:padding="16dp" /> ``` 3. 定义Adapter,例如MyAdapter.java: ``` public class MyAdapter extends BaseAdapter { private List<String> mDataList; public MyAdapter(List<String> dataList) { mDataList = dataList; } @Override public int getCount() { return mDataList.size(); } @Override public Object getItem(int position) { return mDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, false); holder = new ViewHolder(); holder.text = convertView.findViewById(R.id.item_text); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String data = mDataList.get(position); holder.text.setText(data); return convertView; } private static class ViewHolder { TextView text; } } ``` 4. 在Activity中使用ListView: ``` public class MainActivity extends AppCompatActivity { private ListView mListView; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); List<String> dataList = new ArrayList<>(); for (int i = 0; i < 20; i++) { dataList.add("Item " + i); } mAdapter = new MyAdapter(dataList); mListView.setAdapter(mAdapter); } } ``` 这样就完成了一个简单的ListView展示。当数据量较大时,可以使用RecyclerView来优化性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值