zoukankan      html  css  js  c++  java
  • android入门 — ListView的优化

      ListView的运行效率是比较低的,因为在getView()中每次都会将整个布局重新加载一遍,当ListView快速滚动的时候就会成为性能瓶颈。

      调用View中的findViewById()方法获取一次控件的实例,这也是一个很耗时的操作,可以进行优化。

    方法一:convertView参数

      这个参数用于将之前加载好的布局进行缓存,以便之后进行重用。

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            if(convertView == null)
            {
                convertView = inflater.inflate(R.layout.item, null);
            }
            ImageView logo = (ImageView)convertView.findViewById(R.id.logo);
            TextView title = (TextView)convertView.findViewById(R.id.title);
            TextView version = (TextView)convertView.findViewById(R.id.version);
            TextView size = (TextView)convertView.findViewById(R.id.size);
    
            logo.setImageResource((Integer)list.get(position).get("logo"));
            title.setText((String)list.get(position).get("title"));
            version.setText((String)list.get(position).get("version"));
            size.setText((String)list.get(position).get("size"));
    
            Button btn = (Button)convertView.findViewById(R.id.btn);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("dou", "点击");
                }
            });
            return convertView;
        }
    

      使用这个参数用于将之前加载好的布局进行缓存,以便之后进行重用。

      在getView()方法进行判断,如果为空,则使用LayoutInflater去加载布局,如果不为空,则直接对convertView进行重用,这样可以提高ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。

      

    方法二:ViewHolder进行优化

     public View getView(int position, View convertView, ViewGroup parent)
        {
            ViewHolder holder;
            if(convertView == null)
            {
                convertView = inflater.inflate(R.layout.item, null);
                holder = new ViewHolder();
                holder.logo = (ImageView)convertView.findViewById(R.id.logo);
                holder.title = (TextView)convertView.findViewById(R.id.title);
                holder.version = (TextView)convertView.findViewById(R.id.version);
                holder.size = (TextView)convertView.findViewById(R.id.size);
                convertView.setTag(holder);
            }
            else
            {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.logo.setImageResource((Integer)list.get(position).get("logo"));
            holder.title.setText((String)list.get(position).get("title"));
            holder.version.setText((String)list.get(position).get("version"));
            holder.size.setText((String)list.get(position).get("size"));
    
            Button btn = (Button)convertView.findViewById(R.id.btn);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.i("dou", "点击");
                }
            });
            return convertView;
        }
    
        class ViewHolder
        {
            ImageView logo;
            TextView title;
            TextView version;
            TextView size;
        }
    

      当convertView为空的时候:创建一个ViewHolder对象,并将对象的实例都存放在ViewHolder中,然后调用setTag()方法,将ViewHoler对象存储在View中。

      当convertView不为空的时候:调用View的getTag()方法,将ViewHolder重新取出来。

      

      1.viewHolder是一个自定义的类,它存储了通过findViewById获取的空间对象;

      2.当ConvertView被新建时,ViewHolder也随之一起缓存到Recycler中;

      3.当ConvertView被重新利用的时候,ViewHolder也随之取出,从而可以直接给各个控件赋值,而无需再次调用findViewById方法。

      结论:

        无论总量是多少,findViewById方法最多可以调用N+1组(N为一屏可以显示的item的数量)

      通过ViewHolder的方法,可以将所有的控件进行缓存,不需要每次通过findViewById来获取控件实例。

  • 相关阅读:
    HDU 1010 Tempter of the Bone(DFS剪枝)
    HDU 1013 Digital Roots(九余数定理)
    HDU 2680 Choose the best route(反向建图最短路)
    HDU 1596 find the safest road(最短路)
    HDU 2072 单词数
    HDU 3790 最短路径问题 (dijkstra)
    HDU 1018 Big Number
    HDU 1042 N!
    NYOJ 117 求逆序数 (树状数组)
    20.QT文本文件读写
  • 原文地址:https://www.cnblogs.com/Mr24/p/6830921.html
Copyright © 2011-2022 走看看