Android 解释ListView中convertView和视图持有者模式的各自角色
有谁能解释一下convertView和View Holder模式在ListView中的各自作用,以及它们是如何提高ListView的效率的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
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帧/秒的好烟雾