首页 技术 正文
技术 2022年11月6日
0 收藏 446 点赞 510 浏览 3288 个字

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!

Android之ListView性能优化

假设有看过我写过的15k面试题的朋友们一定知道。ListView的优化方式有下面几种:

  1. 重用了convertView
  2. ViewHolder
  3. static
    class ViewHolder
  4. 在列表里面有图片的情况下,监听滑动不载入图片

以上是大致的说了下面,应付面试已经足够了。假设要使用到项目中,可能有些刚開始学习的人就迷茫了。

接下来我具体的说一下。这个是怎样优化的。

  重用了convertViewgetView这种方法会调用的次数是你们的数据条目数*2,重用了convertView,非常大程度上的降低了内存的消耗。通过推断convertView是否为null,是的话就须要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 特点:假设当前的convertView为null,则通过LayoutInflat产生一个view。 

<span style="font-size:14px;">public View getView(int position,View convertView,ViewGroup parent)
{
if(convertView==null)
{
convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);
}
TextViewtv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);
TextViewtv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
ContactInfo1confo=contacts.get(position);
if(confo!=null){//toseteveryitem'stext
tv_name.setText(confo.getContactName());
tv_phone.setText(confo.getContact_Phone());
}
return convertView;
}</span><span style="font-size: 24px;"> </span>

ViewHolder上面的写法会有一个缺点,就是每次在getVIew的时候,都须要又一次的findViewById。又一次找到控件,然后进行控件的赋值以及事件对应设置。这样事实上在做反复的事情。由于的geiview中。事实上包括有这些控件,并且这些控件的id还都是一样的,也就是事实上仅仅要在view中findViewById一次,后面无须要每次都要findViewById了。 以下给出另外一种写法 写发的特点,通常有一个内部类classViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件对应操作的设置,比方onClick等等,这样能够不用每次都要findViewById了,降低了性能的消耗。同一时候重用了convertView。非常大程度上的降低了内存的消耗。 

<span style="font-size:14px;">public View getView(int position,View convertView,ViewGroup parent)
{
ViewHolderholder;
if(convertView==null){
convertView=LayoutInflater.from(context).inflate(R.layout.section_list_item1,null);
holder=newViewHolder();
holder.tv_name=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_name);
holder.tv_phone=(TextView)convertView.findViewById(R.id.contact_contactinfoitem_tv_phoneNum);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
ContactInfo1confo=contacts.get(position);
Log.i("my","confo"+confo.getContactName());
if(confo!=null){//toseteveryitem'stext holder.tv_name.setText(confo.getContactName());
holder.tv_phone.setText(confo.getContact_Phone());
}
return convertView;
}
classViewHolder
{
TextViewtv_name,tv_phone;
} </span>

static class ViewHolder把以上两种结合起来。然后把ViewHolder为static,也就是静态的,静态类仅仅会在第一次载入时会耗费比較长时间。可是后面就能够非常好帮助载入,同一时候保证了内存中仅仅有一个ViewHolder,节省了内存的开销。 我们会发现不管是什么adapter都是这些优化的方式,所以大家肯定思考会没有一种方法能够把代码重用的部分抽出来,假设有这样的想法的朋友能够看下我写的这篇adapter代码优化在列表里面有图片的情况下,监听滑动不载入图片还有一种情况,就是一个列表载入非常多图片,在图片还没载入下来的时候,高速的滑动列表,会发现卡顿的现象发生。这样的情况我们就须要监听。ListView的滑动监听里面设置不载入图片。滑动停止開始载入。

1、推断listView状态
AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {// ListView
// 触摸事件public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑动状态
threadFlag = false;
break;
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止
threadFlag = true;
startThread();
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸listView
threadFlag = false;
break;
default:
// Toast.makeText(contextt, "default",
// Toast.LENGTH_SHORT).show();
break;
}
}
};
2、获取当前屏幕上显示的items:
mListView.getFirstVisiblePosition();
mListView.getLastVisiblePosition();

版权声明:本文博主原创文章,博客,未经同意不得转载。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,489
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,904
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,737
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,490
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,128
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,290