zoukankan      html  css  js  c++  java
  • 08 ListView 优化

    ListVie的优化


    1 固定ListView长宽高

    如下图在清单文件中:

    <ListView
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>

    原因解释:

    我们假设ListView 宽高为Wrap_content那么每次只要ListView加载一个item(某个条目)将会重新计算长宽高带来资源负担;

    对比

    我们先先来看看适配器的代码(BaseAdapter)

    package com.fmy.ListViewDemo2.adpater;
     
    import java.util.List;
     
    import com.fmy.ListViewDemo2.R;
    import com.fmy.ListViewDemo2.been.Person;
     
     
     
    import android.app.Activity;
    import android.content.Context;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
     
    public class MyAdpater extends BaseAdapter{
     
        List<Person> list;
        Context context;
     
        class viewHold {
            TextView tv ;
        }
        public MyAdpater(List<Person> list, Context context) {
            super();
            this.list = list;
            this.context = context;
        }
     
        @Override
        public int getCount() {
            Log.e("==", "getCount");
            return 3;
        }
     
        @Override
        public Object getItem(int position) {
            Log.e("==", "getItem");
            return position;
        }
     
        @Override
        public long getItemId(int position) {
            Log.e("==", "getItemId");
            return position;
        }
     
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.e("==>>", "POSTION:"+position);
            View view= null;
            viewHold tag = null;
            if (convertView==null){
                LayoutInflater inflater = LayoutInflater.from(context);
                view = inflater.inflate(android.R.layout.simple_spinner_item, parent,false);
                viewHold hold = new viewHold();
                hold.tv=(TextView) view;
                view.setTag(hold);
                tag = hold;
            }else{
                view =convertView;
                tag = (viewHold) view.getTag();
            }
            tag.tv.setText("你好");
            return view;
        }
     
         
    }



    • 我们假设第一种情况设置长宽高为固定值 输出结果:image可以发现输出结果和加载的内容长度一致 证明只执行了三次getView

    • 我们再看看包裹内容的输出结果: image可以看到输出了N多条信息证明执行了getView多次 因为每次你加载一个item就会重新计算ListView的长宽高

    2判断缓存View是否存在

    public View getView(int position, View convertView, ViewGroup parent)

    此方法每次调用都会自动缓存return的View所以 我们只会判断是否View是否存在,如果存在则直接使用 ,如果不存在那么用填充器在生成.

    原因:

    用户每次滑动一次看到新的Item的时候就会调用getView 如果用户滑动过快 每次填充次数太多生成过多的View 或者内存不足 等导致内存溢出而奔溃掉

    代码: 在上面

    3保存填充View的子控件对象

    原因

    我们一般填充一个View 后给其子元素控件赋值 但是用findViewId是会遍历整个ID文件的非常耗费资源因此我们 创建一个对象 里面创建子元素的控件对象,然后在存入View.setTag中 然后我们使用的取出调用即可


  • 相关阅读:
    js 数据图表
    yii query builder
    mysql if
    这又是起点
    [cookie篇]从cookie-parser中间件说起
    How to find and fix Bash Shell-shock vulnerability CVE-2014-6271 in unix like system
    AngularJS打印问题
    笔记本上班时间自动静音下班自动打开
    SCP命令
    Installing Ruby 1.9.3 on Ubuntu 12.04 Precise Pengolin (without RVM)
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152279.html
Copyright © 2011-2022 走看看