您的位置:首页 > 移动开发 > Android开发

ListView性能优化

2015-08-17 22:51 489 查看
前期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中等待

重用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息