zoukankan      html  css  js  c++  java
  • ym——Android之ListView性能优化

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


    Android之ListView性能优化

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

    1. 重用了convertView
    2. ViewHolder
    3. static class ViewHolder
    4. 在列表里面有图片的情况下,监听滑动不载入图片
    以上是大致的说了下面,应付面试已经足够了。假设要使用到项目中,可能有些刚開始学习的人就迷茫了。

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

      重用了convertView
    getView这种方法会调用的次数是你们的数据条目数*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();


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

  • 相关阅读:
    git can't merge 的处理 代码冲突问题的解决
    react 父组件向子组件传递函数
    node fs 文件/目录 删除
    node 调用Python exec child_process 模块
    node 设置自动启用定时任务控件 node-schedule
    Python 安装
    常见Python 中pip用法(待继续添加)
    机器审核图片学习(2)安装pornDetector所用环境-python、scikit-learn、opencv
    机器审核图片学习(1)pornDetector
    机器学习工具
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4913145.html
Copyright © 2011-2022 走看看