提升ListView的运行效率和ListView的其他属性

来源:互联网 发布:红鸟棋牌源码网盘下载 编辑:程序博客网 时间:2024/05/24 01:42

提升ListView的运行效率

这里用到了两个参数 一个是convertView,另一个是ViewHolder,其实ViewHolder并不是一个参数。

public View getView(int position, View convertView, ViewGroup parent) {     //使用inflate方法来载入layout的xml        View view=mInflater.inflate(R.layout.activity_simplelist,null);        Student student=mData.get(position);        TextView textView_name= (TextView) view.findViewById(R.id.text_name);        TextView textView_age= (TextView) view.findViewById(R.id.text_age);        TextView textView_sex= (TextView) view.findViewById(R.id.text_sex);        TextView textView_hobby= (TextView) view.findViewById(R.id.text_hobby);        textView_name.setText(student.getName());        textView_age.setText(student.getAge());        textView_sex.setText(student.getSex());        textView_hobby.setText(student.getHobby());        return view;    }

在上边的代码中,每次都将布局重新加载了一遍,在ListView快速滚动的时候就会成为性能的瓶颈。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View。这时候就用到了convertView,convertView这个参数是用来将之前加载好的布局进行缓存,以便之后可以进行重用。除此之外,findViewById()方法会每次都去获取一次控件的实例。在这里可以用一个ViewHolder来对这部分的性能进行优化。

 public View getView(final int position, View convertView, ViewGroup parent) {        //使用inflate方法来载入layout的xml        Student student = mData.get(position);        ViewHolder viewHolder;        if (convertView == null) {            convertView = mInflater.inflate(R.layout.activity_simplelist, null);            viewHolder=new ViewHolder();            viewHolder.textView_name = (TextView)convertView.findViewById(R.id.text_name);            viewHolder.textView_age = (TextView) convertView.findViewById(R.id.text_age);            viewHolder.textView_sex = (TextView) convertView.findViewById(R.id.text_sex);            viewHolder.textView_hobby = (TextView) convertView.findViewById(R.id.text_hobby);            viewHolder.imageView_photo= (ImageView) convertView.findViewById(R.id.imageview_photo);            viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);            convertView.setTag(viewHolder);        }else{            viewHolder= (ViewHolder) convertView.getTag();        }        viewHolder.textView_name.setText(student.getName());        viewHolder.textView_age.setText(student.getAge());        viewHolder.textView_sex.setText(student.getSex());        viewHolder.textView_hobby.setText(student.getHobby());        viewHolder.imageView_photo.setImageResource(student.getImg());        return convertView;    }    class ViewHolder{        TextView textView_name;        TextView textView_age;        TextView textView_sex;        TextView textView_hobby;        ImageView imageView_photo;        CheckBox checkBox;    }

在上边的代码中,在getView()方法中进行了判断,如果conVertView为空,则用LayoutInflater去加载布局,如果不为空则直接对convertView进行重用。另外新增了一个内部类ViewHolder,用于对空间的实例进行缓存。当conVertView为空的时候,会创建一个ViewHolder对象,并将空间的实例都存放在ViewHolder中,然后调用setTag()方法,将ViewHolder对象存储在conVertView中,conVertView不为空的时候调用getTag()方法吧ViewHolder重新取出。

0 0