ListView性能优化

来源:互联网 发布:一个问题阻止了windows 编辑:程序博客网 时间:2024/06/03 18:05
前期ListView列表存在的问题:
    每个列表项都是新建出来的,存在两个耗时的地方
    LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(R.layout.phone_item_2, null);
    TextView name = (TextView) v.findViewById(R.id.name);
    上面两个方法要尽可能少的调用

为了提高手机滑动的流畅性
  解决办法
    View的重用
    View的每次创建是比较耗时的,因此对于getView方法传入的
        convertView应充分利
    ViewHolder的应用
    View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,
    之后就用View.getTag()方法来获得ViewHolder对象

Recycler的运行机制:
    Adapter中的public View getView(int position, View convertView,
    ViewGroup arg2)
    这个方法是ListView性能好坏的关键。方法中有个convertView,
    这个是Android在 为我们而做的缓存机制。

    ListView中每个item都是通过getView返回并显示的,假如item有很多个,
    那么重复创建这么多对象来显示显然是不合理。因 此,Android提供了
    Recycler,将没有正在显示的item放进RecycleBin(回收站),然后在显

    示新视图时从RecycleBin中复用这个 View。


Recycler原理图:


案例:
    @Override
        public View getView(int position, View convertView, ViewGroup arg2) {
            ViewHolder viewHolder = null;
            
            if(convertView==null){
                LayoutInflater layoutInflater = LayoutInflater.from(context);
                viewHolder = new ViewHolder();
                
                convertView = layoutInflater.inflate(R.layout.call_item, null);
                viewHolder.call_item_tv_familyname = (TextView) convertView.findViewById(R.id.call_item_tv_familyname);
                viewHolder.call_item_tv_name = (TextView) convertView.findViewById(R.id.call_item_tv_name);
                viewHolder.call_item_tv_phone = (TextView) convertView.findViewById(R.id.call_item_tv_phone);
                
                
                convertView.setTag(viewHolder);
            }else{
                viewHolder = (ViewHolder) convertView.getTag();
            }
            User2 user = user2List.get(position);
            viewHolder.call_item_tv_familyname.setText(user.getFamilyName());
            viewHolder.call_item_tv_name.setText(user.getName());
            viewHolder.call_item_tv_phone.setText(user.getPhone());
            viewHolder.call_item_tv_familyname.setBackgroundColor(colorId[getRandomNum()]);
            return convertView;
            
        }
        

    
    final class ViewHolder{
        TextView call_item_tv_familyname;
        TextView call_item_tv_name;
        TextView call_item_tv_phone;
    }


convertView在屏幕可以容纳item时,每一次都是空的,只有当item的数量超出
手机屏幕所能容纳的数量时,滚出手机屏幕的那个item会放入convertView中等待
重用。
0 0
原创粉丝点击