-3

谁能解释 ListView 中 convertView 和 View Holder Pattern 的各自作用,以及它们如何提高 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;
    }
}
4

2 回答 2

0

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

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

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

于 2017-05-27T14:23:54.357 回答
0
  • 转换视图

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

通过减少视图膨胀(调用inflater.inflate代价高昂)、减少垃圾收集和内存分配来提高性能。

  • 视图持有人

直接引用您的观点。

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

于 2017-05-27T14:27:15.467 回答