Android 解释ListView中convertView和视图持有者模式的各自角色

Android 解释ListView中convertView和视图持有者模式的各自角色,android,listview,android-viewholder,convertview,Android,Listview,Android Viewholder,Convertview,有谁能解释一下convertView和View Holder模式在ListView中的各自作用,以及它们是如何提高ListView的效率的 private class PersonsAdapter extends ArrayAdapter<Person> { @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder hol

有谁能解释一下convertView和View Holder模式在ListView中的各自作用,以及它们是如何提高ListView的效率的

private class PersonsAdapter extends ArrayAdapter<Person> {

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_entry, null);
            holder = new ViewHolder();
            holder.nameTextView = (TextView) convertView.findViewById(R.id.person_name);
            holder.surnameTextView = (TextView) convertView.findViewById(R.id.person_surname);
            holder.personImageView = (ImageView) convertView.findViewById(R.id.person_image);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        Person person = getItem(position);

        holder.nameTextView.setText(person.getName());
        holder.surnameTextView.setText(person.getSurname());
        //holder.personImageView.setImageBitmap(person.getImage());

        return convertView;
    }
}
私有类PersonAdapter扩展了ArrayAdapter{
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=mInflater.充气(R.layout.list_条目,空);
holder=新的ViewHolder();
holder.nameTextView=(TextView)convertView.findViewById(R.id.person\u name);
holder.namestextView=(TextView)convertView.findViewById(R.id.person\u姓氏);
holder.personImageView=(ImageView)convertView.findViewById(R.id.person\u image);
convertView.setTag(支架);
}
否则{
holder=(ViewHolder)convertView.getTag();
}
人员=获取项目(职位);
holder.nameTextView.setText(person.getName());
holder.namestextview.setText(person.getnamame());
//holder.personImageView.setImageBitmap(person.getImage());
返回视图;
}
}

在SO中有很多关于这方面的帖子。 但简而言之,它是关于重用ListView中的对象,而不是实例化新对象。 在列表视图中,屏幕上有固定数量的项目。因此,当一个新项目可能从底部进入时,前一个项目将从顶部消失

因此convertview将是存储正在消失的数据的对象,您可以重用它来存储新的传入数据

如果converView为空,则需要创建一个新视图来存储传入数据。如果不为空,您可以将其重新用于新数据,而不是创建新视图。

  • convertView
它是一个视图,以前是膨胀的(当
convertView==null
时)并且在屏幕上,但现在已经从屏幕上滚动出来,因此您可以重新使用它来显示即将进入屏幕的视图中的数据

通过减少视图膨胀(调用
inflater.inflate
非常昂贵),减少垃圾收集,并减少内存分配来提高性能

  • 视图持有者
保持对您的视图的直接引用

可能会提高性能,因为
findViewById
是一个围绕视图层次结构的for循环,可能会占用UI线程相当宝贵的时间。这种改进可能很小,但在一个快速滚动列表中,每一纳秒都算得上是60帧/秒的好烟雾